From: Rafael Espindola Date: Mon, 6 Dec 2010 14:53:14 +0000 (+0000) Subject: Add an EmitAbsValue helper method and use it in cases where we want to be sure X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2303c9dd69476d045af7cee94e112dd77d22fd28;p=oota-llvm.git Add an EmitAbsValue helper method and use it in cases where we want to be sure that no relocations are used (on MochO). Fixes llc producing different output from llc + llvm-mc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121000 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index d89ee9ae126..fce076a57eb 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -249,6 +249,11 @@ namespace llvm { virtual void EmitIntValue(uint64_t Value, unsigned Size, unsigned AddrSpace = 0); + /// EmitAbsValue - Emit the Value, but try to avoid relocations. On MachO + /// this is done by producing + /// foo = value + /// .long foo + void EmitAbsValue(const MCExpr *Value, unsigned Size); virtual void EmitULEB128Value(const MCExpr *Value, unsigned AddrSpace = 0) = 0; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp index f737e90b155..1f7ac95f7b3 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp @@ -156,7 +156,7 @@ void AsmPrinter::EmitReference(const MCSymbol *Sym, unsigned Encoding) const { const MCExpr *Exp = TLOF.getExprForDwarfReference(Sym, Mang, MMI, Encoding, OutStreamer); - OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding), /*addrspace*/0); + OutStreamer.EmitAbsValue(Exp, GetSizeOfEncodedValue(Encoding)); } void AsmPrinter::EmitReference(const GlobalValue *GV, unsigned Encoding)const{ diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 53731dca7eb..5d36ee3e626 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -213,15 +213,8 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS, // The first 4 bytes is the total length of the information for this // compilation unit (not including these 4 bytes for the length). - // FIXME: We create the dummy TotalLength variable because LineEndSym points - // to the end of the section and the darwin assembler doesn't consider that - // difference an assembly time constant. It might be better for this to be - // proected by a flag. - MCSymbol *TotalLength = MCOS->getContext().CreateTempSymbol(); - MCOS->EmitAssignment(TotalLength, - MakeStartMinusEndExpr(MCOS, LineStartSym, LineEndSym, - 4)); - MCOS->EmitSymbolValue(TotalLength, 4, 0); + MCOS->EmitAbsValue(MakeStartMinusEndExpr(MCOS, LineStartSym, LineEndSym,4), + 4); // Next 2 bytes is the Version, which is Dwarf 2. MCOS->EmitIntValue(2, 2); diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 6df4ae44e40..b9d59056f3b 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -72,6 +72,12 @@ void MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) { EmitBytes(OSE.str(), AddrSpace); } +void MCStreamer::EmitAbsValue(const MCExpr *Value, unsigned Size) { + MCSymbol *ABS = getContext().CreateTempSymbol(); + EmitAssignment(ABS, Value); + EmitSymbolValue(ABS, Size, 0); +} + void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size, unsigned AddrSpace) { EmitValue(MCSymbolRefExpr::Create(Sym, getContext()), Size, AddrSpace);