Index: llvm-3.8.0.dw-relocs/include/llvm/MC/MCStreamer.h =================================================================== --- llvm-3.8.0.dw-relocs/include/llvm/MC/MCStreamer.h +++ llvm-3.8.0.dw-relocs/include/llvm/MC/MCStreamer.h @@ -456,7 +456,7 @@ /// \brief Emits a COFF section relative relocation. /// /// \param Symbol - Symbol the section relative relocation should point to. - virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); + virtual void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset); /// \brief Emit an ELF .size directive. /// Index: llvm-3.8.0.dw-relocs/include/llvm/MC/MCWinCOFFStreamer.h =================================================================== --- llvm-3.8.0.dw-relocs/include/llvm/MC/MCWinCOFFStreamer.h +++ llvm-3.8.0.dw-relocs/include/llvm/MC/MCWinCOFFStreamer.h @@ -52,7 +52,7 @@ void EndCOFFSymbolDef() override; void EmitCOFFSafeSEH(MCSymbol const *Symbol) override; void EmitCOFFSectionIndex(MCSymbol const *Symbol) override; - void EmitCOFFSecRel32(MCSymbol const *Symbol) override; + void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) override; void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override; void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Index: llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1729,7 +1729,7 @@ unsigned Size, bool IsSectionRelative) const { if (MAI->needsDwarfSectionOffsetDirective() && IsSectionRelative) { - OutStreamer->EmitCOFFSecRel32(Label); + OutStreamer->EmitCOFFSecRel32(Label, Offset); return; } Index: llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp +++ llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp @@ -150,7 +150,7 @@ if (!ForceOffset) { // On COFF targets, we have to emit the special .secrel32 directive. if (MAI->needsDwarfSectionOffsetDirective()) { - OutStreamer->EmitCOFFSecRel32(Label); + OutStreamer->EmitCOFFSecRel32(Label, /*offset*/0); return; } Index: llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/DIE.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/DIE.cpp +++ llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/DIE.cpp @@ -487,7 +487,7 @@ Addr += CU->getDebugInfoOffset(); if (AP->MAI->doesDwarfUseRelocationsAcrossSections()) AP->EmitLabelPlusOffset(CU->getSectionSym(), Addr, - DIEEntry::getRefAddrSize(AP)); + DIEEntry::getRefAddrSize(AP), true); else AP->OutStreamer->EmitIntValue(Addr, DIEEntry::getRefAddrSize(AP)); } else Index: llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp +++ llvm-3.8.0.dw-relocs/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp @@ -231,7 +231,7 @@ // code is located and what's its size: EmitLabelDiff(*Asm->OutStreamer, Fn, FI.End); Asm->OutStreamer->EmitFill(12, 0); - Asm->OutStreamer->EmitCOFFSecRel32(Fn); + Asm->OutStreamer->EmitCOFFSecRel32(Fn, /*offset*/0); Asm->OutStreamer->EmitCOFFSectionIndex(Fn); Asm->EmitInt8(0); // Emit the function display name as a null-terminated string. @@ -272,7 +272,7 @@ Asm->OutStreamer->EmitLabel(LineTableBegin); // Identify the function this subsection is for. - Asm->OutStreamer->EmitCOFFSecRel32(Fn); + Asm->OutStreamer->EmitCOFFSecRel32(Fn, /*offset*/0); Asm->OutStreamer->EmitCOFFSectionIndex(Fn); // Insert flags after a 16-bit section index. Asm->EmitInt16(COFF::DEBUG_LINE_TABLES_HAVE_COLUMN_RECORDS); Index: llvm-3.8.0.dw-relocs/lib/MC/MCAsmStreamer.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/MC/MCAsmStreamer.cpp +++ llvm-3.8.0.dw-relocs/lib/MC/MCAsmStreamer.cpp @@ -143,7 +143,7 @@ void EndCOFFSymbolDef() override; void EmitCOFFSafeSEH(MCSymbol const *Symbol) override; void EmitCOFFSectionIndex(MCSymbol const *Symbol) override; - void EmitCOFFSecRel32(MCSymbol const *Symbol) override; + void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) override; void emitELFSize(MCSymbolELF *Symbol, const MCExpr *Value) override; void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override; @@ -525,7 +525,7 @@ EmitEOL(); } -void MCAsmStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { +void MCAsmStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) { OS << "\t.secrel32\t"; Symbol->print(OS, MAI); EmitEOL(); Index: llvm-3.8.0.dw-relocs/lib/MC/MCParser/COFFAsmParser.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/MC/MCParser/COFFAsmParser.cpp +++ llvm-3.8.0.dw-relocs/lib/MC/MCParser/COFFAsmParser.cpp @@ -450,7 +450,7 @@ MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID); Lex(); - getStreamer().EmitCOFFSecRel32(Symbol); + getStreamer().EmitCOFFSecRel32(Symbol, /*Offset=*/0); return false; } Index: llvm-3.8.0.dw-relocs/lib/MC/MCStreamer.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/MC/MCStreamer.cpp +++ llvm-3.8.0.dw-relocs/lib/MC/MCStreamer.cpp @@ -119,7 +119,7 @@ if (!IsSectionRelative) EmitValueImpl(MCSymbolRefExpr::create(Sym, getContext()), Size); else - EmitCOFFSecRel32(Sym); + EmitCOFFSecRel32(Sym, /*Offset=*/0); } void MCStreamer::EmitGPRel64Value(const MCExpr *Value) { @@ -570,7 +570,7 @@ void MCStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) { } -void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { +void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) { } /// EmitRawText - If this file is backed by an assembly streamer, this dumps Index: llvm-3.8.0.dw-relocs/lib/MC/WinCOFFStreamer.cpp =================================================================== --- llvm-3.8.0.dw-relocs/lib/MC/WinCOFFStreamer.cpp +++ llvm-3.8.0.dw-relocs/lib/MC/WinCOFFStreamer.cpp @@ -199,11 +199,18 @@ DF->getContents().resize(DF->getContents().size() + 2, 0); } -void MCWinCOFFStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { +void MCWinCOFFStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) { MCDataFragment *DF = getOrCreateDataFragment(); - const MCSymbolRefExpr *SRE = MCSymbolRefExpr::create(Symbol, getContext()); - MCFixup Fixup = MCFixup::create(DF->getContents().size(), SRE, FK_SecRel_4); + // Create Symbol A for the relocation relative reference. + const MCExpr *MCE = MCSymbolRefExpr::create(Symbol, getContext()); + // Add the constant offset, if given + if (Offset) + MCE = MCBinaryExpr::createAdd(MCE, MCConstantExpr::create(Offset, getContext()), getContext()); + // Build the secrel32 relocation. + MCFixup Fixup = MCFixup::create(DF->getContents().size(), MCE, FK_SecRel_4); + // Record the relocation. DF->getFixups().push_back(Fixup); + // Emit 4 bytes (zeros) to the object file. DF->getContents().resize(DF->getContents().size() + 4, 0); }