diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-04-30 03:44:37 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-04-30 03:44:37 +0000 |
commit | f1a5c7ec04002769f1638e64f7439589f0f926e6 (patch) | |
tree | fb8c17ee530e039a738611d8de2ee46488c2ca73 /lib/MC/MCAsmStreamer.cpp | |
parent | a37bd1d02c0e3d93474fdf30352bf4a425cbe25b (diff) | |
download | external_llvm-f1a5c7ec04002769f1638e64f7439589f0f926e6.tar.gz external_llvm-f1a5c7ec04002769f1638e64f7439589f0f926e6.tar.bz2 external_llvm-f1a5c7ec04002769f1638e64f7439589f0f926e6.zip |
Add all the plumbing needed for MC to expand cfi to the old tables in
the final assembly. It is the same technique used when targeting
assemblers that don't support .loc.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130587 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAsmStreamer.cpp')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 2538475e4e..b0b948e2b9 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -45,20 +45,20 @@ class MCAsmStreamer : public MCStreamer { unsigned IsVerboseAsm : 1; unsigned ShowInst : 1; unsigned UseLoc : 1; + unsigned UseCFI : 1; bool needsSet(const MCExpr *Value); public: MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os, - bool isVerboseAsm, - bool useLoc, + bool isVerboseAsm, bool useLoc, bool useCFI, MCInstPrinter *printer, MCCodeEmitter *emitter, TargetAsmBackend *asmbackend, bool showInst) : MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend), CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm), - ShowInst(showInst), UseLoc(useLoc) { + ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI) { if (InstPrinter && IsVerboseAsm) InstPrinter->setCommentStream(CommentStream); } @@ -740,6 +740,9 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, void MCAsmStreamer::EmitCFIStartProc() { MCStreamer::EmitCFIStartProc(); + if (!UseCFI) + return; + OS << "\t.cfi_startproc"; EmitEOL(); } @@ -747,6 +750,9 @@ void MCAsmStreamer::EmitCFIStartProc() { void MCAsmStreamer::EmitCFIEndProc() { MCStreamer::EmitCFIEndProc(); + if (!UseCFI) + return; + OS << "\t.cfi_endproc"; EmitEOL(); } @@ -754,6 +760,9 @@ void MCAsmStreamer::EmitCFIEndProc() { void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) { MCStreamer::EmitCFIDefCfa(Register, Offset); + if (!UseCFI) + return; + OS << ".cfi_def_cfa " << Register << ", " << Offset; EmitEOL(); } @@ -761,6 +770,9 @@ void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) { void MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) { MCStreamer::EmitCFIDefCfaOffset(Offset); + if (!UseCFI) + return; + OS << "\t.cfi_def_cfa_offset " << Offset; EmitEOL(); } @@ -768,6 +780,9 @@ void MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) { void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) { MCStreamer::EmitCFIDefCfaRegister(Register); + if (!UseCFI) + return; + OS << "\t.cfi_def_cfa_register " << Register; EmitEOL(); } @@ -775,6 +790,9 @@ void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) { void MCAsmStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) { this->MCStreamer::EmitCFIOffset(Register, Offset); + if (!UseCFI) + return; + OS << "\t.cfi_offset " << Register << ", " << Offset; EmitEOL(); } @@ -783,6 +801,9 @@ void MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) { MCStreamer::EmitCFIPersonality(Sym, Encoding); + if (!UseCFI) + return; + OS << "\t.cfi_personality " << Encoding << ", " << *Sym; EmitEOL(); } @@ -790,6 +811,9 @@ void MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym, void MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) { MCStreamer::EmitCFILsda(Sym, Encoding); + if (!UseCFI) + return; + OS << "\t.cfi_lsda " << Encoding << ", " << *Sym; EmitEOL(); } @@ -797,6 +821,9 @@ void MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) { void MCAsmStreamer::EmitCFIRememberState() { MCStreamer::EmitCFIRememberState(); + if (!UseCFI) + return; + OS << "\t.cfi_remember_state"; EmitEOL(); } @@ -804,6 +831,9 @@ void MCAsmStreamer::EmitCFIRememberState() { void MCAsmStreamer::EmitCFIRestoreState() { MCStreamer::EmitCFIRestoreState(); + if (!UseCFI) + return; + OS << "\t.cfi_restore_state"; EmitEOL(); } @@ -811,6 +841,9 @@ void MCAsmStreamer::EmitCFIRestoreState() { void MCAsmStreamer::EmitCFISameValue(int64_t Register) { MCStreamer::EmitCFISameValue(Register); + if (!UseCFI) + return; + OS << "\t.cfi_same_value " << Register; EmitEOL(); } @@ -818,6 +851,9 @@ void MCAsmStreamer::EmitCFISameValue(int64_t Register) { void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) { MCStreamer::EmitCFIRelOffset(Register, Offset); + if (!UseCFI) + return; + OS << "\t.cfi_rel_offset " << Register << ", " << Offset; EmitEOL(); } @@ -825,6 +861,9 @@ void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) { void MCAsmStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) { MCStreamer::EmitCFIAdjustCfaOffset(Adjustment); + if (!UseCFI) + return; + OS << "\t.cfi_adjust_cfa_offset " << Adjustment; EmitEOL(); } @@ -1008,8 +1047,9 @@ void MCAsmStreamer::Finish() { MCStreamer *llvm::createAsmStreamer(MCContext &Context, formatted_raw_ostream &OS, bool isVerboseAsm, bool useLoc, + bool useCFI, MCInstPrinter *IP, MCCodeEmitter *CE, TargetAsmBackend *TAB, bool ShowInst) { - return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc, + return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc, useCFI, IP, CE, TAB, ShowInst); } |