diff options
author | Chris Lattner <sabre@nondot.org> | 2010-03-08 23:58:37 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-03-08 23:58:37 +0000 |
commit | 9889c1eb9e566e06235c28c4dade5c5f266eb40d (patch) | |
tree | 0f597682b01bbb8b40468bb4b681ed669f48d08f /llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | |
parent | c9e8621268cc818bdde073e7fbbf25e78dc7cdb1 (diff) | |
download | bcm5719-llvm-9889c1eb9e566e06235c28c4dade5c5f266eb40d.tar.gz bcm5719-llvm-9889c1eb9e566e06235c28c4dade5c5f266eb40d.zip |
move .set generation out of DwarfPrinter into AsmPrinter and
MCize it.
llvm-svn: 98010
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index c0d92ffbbbc..5db2b0749d5 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -61,7 +61,7 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, : MachineFunctionPass(&ID), O(o), TM(tm), MAI(T), TRI(tm.getRegisterInfo()), OutContext(Ctx), OutStreamer(Streamer), - LastMI(0), LastFn(0), Counter(~0U), PrevDLT(NULL) { + LastMI(0), LastFn(0), Counter(~0U), SetCounter(0), PrevDLT(NULL) { DW = 0; MMI = 0; VerboseAsm = Streamer.isVerboseAsm(); } @@ -893,6 +893,33 @@ void AsmPrinter::EmitInt64(uint64_t Value) const { OutStreamer.EmitIntValue(Value, 8, 0/*addrspace*/); } +/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size +/// in bytes of the directive is specified by Size and Hi/Lo specify the +/// labels. This implicitly uses .set if it is available. +void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, + unsigned Size) const { + // Get the Hi-Lo expression. + const MCExpr *Diff = + MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi, OutContext), + MCSymbolRefExpr::Create(Lo, OutContext), + OutContext); + + if (!MAI->hasSetDirective()) { + OutStreamer.EmitValue(Diff, Size, 0/*AddrSpace*/); + return; + } + + // Otherwise, emit with .set (aka assignment). + MCSymbol *SetLabel = + OutContext.GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) + "set" + + Twine(SetCounter++)); + OutStreamer.EmitAssignment(SetLabel, Diff); + + OutStreamer.EmitValue(MCSymbolRefExpr::Create(SetLabel, OutContext), + Size, 0/*AddrSpace*/); +} + + //===----------------------------------------------------------------------===// // EmitAlignment - Emit an alignment directive to the specified power of |