<div dir="ltr">It's not an extension, it's a feature implemented by GNU as: <a href="https://sourceware.org/binutils/docs/as/Reloc.html#Reloc">https://sourceware.org/binutils/docs/as/Reloc.html#Reloc</a></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 20, 2016 at 11:53 AM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This should probably be documented in docs/Extensions.rst.<br>
<br>
Thanks,<br>
Rafael<br>
<br>
<br>
On 19 January 2016 at 18:05, David Majnemer via llvm-commits<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: majnemer<br>
> Date: Tue Jan 19 17:05:27 2016<br>
> New Revision: 258216<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=258216&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=258216&view=rev</a><br>
> Log:<br>
> [MC, COFF] Add .reloc support for WinCOFF<br>
><br>
> This adds rudimentary support for a few relocations that we will use for<br>
> the CodeView debug format.<br>
><br>
> Added:<br>
>     llvm/trunk/test/MC/Mips/reloc-directive-negative.s<br>
>     llvm/trunk/test/MC/X86/reloc-directive.s<br>
> Modified:<br>
>     llvm/trunk/include/llvm/MC/MCAsmBackend.h<br>
>     llvm/trunk/lib/MC/MCAsmBackend.cpp<br>
>     llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
>     llvm/trunk/lib/MC/MCParser/AsmParser.cpp<br>
>     llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp<br>
>     llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h<br>
>     llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp<br>
>     llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp<br>
><br>
> Modified: llvm/trunk/include/llvm/MC/MCAsmBackend.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmBackend.h?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmBackend.h?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/MC/MCAsmBackend.h (original)<br>
> +++ llvm/trunk/include/llvm/MC/MCAsmBackend.h Tue Jan 19 17:05:27 2016<br>
> @@ -11,6 +11,7 @@<br>
>  #define LLVM_MC_MCASMBACKEND_H<br>
><br>
>  #include "llvm/ADT/ArrayRef.h"<br>
> +#include "llvm/ADT/Optional.h"<br>
>  #include "llvm/MC/MCDirectives.h"<br>
>  #include "llvm/MC/MCDwarf.h"<br>
>  #include "llvm/MC/MCFixup.h"<br>
> @@ -68,9 +69,7 @@ public:<br>
>    virtual unsigned getNumFixupKinds() const = 0;<br>
><br>
>    /// Map a relocation name used in .reloc to a fixup kind.<br>
> -  /// Returns true and sets MappedKind if Name is successfully mapped.<br>
> -  /// Otherwise returns false and leaves MappedKind unchanged.<br>
> -  virtual bool getFixupKind(StringRef Name, MCFixupKind &MappedKind) const;<br>
> +  virtual Optional<MCFixupKind> getFixupKind(StringRef Name) const;<br>
><br>
>    /// Get information on a fixup kind.<br>
>    virtual const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const;<br>
><br>
> Modified: llvm/trunk/lib/MC/MCAsmBackend.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmBackend.cpp?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmBackend.cpp?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/MC/MCAsmBackend.cpp (original)<br>
> +++ llvm/trunk/lib/MC/MCAsmBackend.cpp Tue Jan 19 17:05:27 2016<br>
> @@ -16,8 +16,8 @@ MCAsmBackend::MCAsmBackend() : HasDataIn<br>
><br>
>  MCAsmBackend::~MCAsmBackend() {}<br>
><br>
> -bool MCAsmBackend::getFixupKind(StringRef Name, MCFixupKind &MappedKind) const {<br>
> -  return false;<br>
> +Optional<MCFixupKind> MCAsmBackend::getFixupKind(StringRef Name) const {<br>
> +  return None;<br>
>  }<br>
><br>
>  const MCFixupKindInfo &MCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {<br>
><br>
> Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)<br>
> +++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Tue Jan 19 17:05:27 2016<br>
> @@ -420,13 +420,18 @@ bool MCObjectStreamer::EmitRelocDirectiv<br>
>    if (!Offset.evaluateAsAbsolute(OffsetValue))<br>
>      llvm_unreachable("Offset is not absolute");<br>
><br>
> +  if (OffsetValue < 0)<br>
> +    llvm_unreachable("Offset is negative");<br>
> +<br>
>    MCDataFragment *DF = getOrCreateDataFragment();<br>
>    flushPendingLabels(DF, DF->getContents().size());<br>
><br>
> -  MCFixupKind Kind;<br>
> -  if (!Assembler->getBackend().getFixupKind(Name, Kind))<br>
> +  Optional<MCFixupKind> MaybeKind = Assembler->getBackend().getFixupKind(Name);<br>
> +  if (!MaybeKind.hasValue())<br>
>      return true;<br>
><br>
> +  MCFixupKind Kind = *MaybeKind;<br>
> +<br>
>    if (Expr == nullptr)<br>
>      Expr =<br>
>          MCSymbolRefExpr::create(getContext().createTempSymbol(), getContext());<br>
><br>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)<br>
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Tue Jan 19 17:05:27 2016<br>
> @@ -2485,6 +2485,9 @@ bool AsmParser::parseDirectiveReloc(SMLo<br>
>    if (!Offset->evaluateAsAbsolute(OffsetValue))<br>
>      return Error(OffsetLoc, "expression is not a constant value");<br>
><br>
> +  if (OffsetValue < 0)<br>
> +    return Error(OffsetLoc, "expression is negative");<br>
> +<br>
>    if (Lexer.isNot(AsmToken::Comma))<br>
>      return TokError("expected comma");<br>
>    Lexer.Lex();<br>
><br>
> Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp (original)<br>
> +++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp Tue Jan 19 17:05:27 2016<br>
> @@ -248,16 +248,11 @@ void MipsAsmBackend::applyFixup(const MC<br>
>    }<br>
>  }<br>
><br>
> -bool MipsAsmBackend::getFixupKind(StringRef Name, MCFixupKind &MappedKind) const {<br>
> -  if (Name == "R_MIPS_NONE") {<br>
> -    MappedKind = (MCFixupKind)Mips::fixup_Mips_NONE;<br>
> -    return true;<br>
> -  }<br>
> -  if (Name == "R_MIPS_32") {<br>
> -    MappedKind = FK_Data_4;<br>
> -    return true;<br>
> -  }<br>
> -  return MCAsmBackend::getFixupKind(Name, MappedKind);<br>
> +Optional<MCFixupKind> MipsAsmBackend::getFixupKind(StringRef Name) const {<br>
> +  return StringSwitch<Optional<MCFixupKind>>(Name)<br>
> +      .Case("R_MIPS_NONE", (MCFixupKind)Mips::fixup_Mips_NONE)<br>
> +      .Case("R_MIPS_32", FK_Data_4)<br>
> +      .Default(MCAsmBackend::getFixupKind(Name));<br>
>  }<br>
><br>
>  const MCFixupKindInfo &MipsAsmBackend::<br>
><br>
> Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h (original)<br>
> +++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h Tue Jan 19 17:05:27 2016<br>
> @@ -41,7 +41,7 @@ public:<br>
>    void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,<br>
>                    uint64_t Value, bool IsPCRel) const override;<br>
><br>
> -  bool getFixupKind(StringRef Name, MCFixupKind &MappedKind) const override;<br>
> +  Optional<MCFixupKind> getFixupKind(StringRef Name) const override;<br>
>    const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;<br>
><br>
>    unsigned getNumFixupKinds() const override {<br>
><br>
> Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp (original)<br>
> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp Tue Jan 19 17:05:27 2016<br>
> @@ -90,10 +90,11 @@ public:<br>
><br>
>    const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override {<br>
>      const static MCFixupKindInfo Infos[X86::NumTargetFixupKinds] = {<br>
> -      { "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel },<br>
> -      { "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel},<br>
> +      { "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel, },<br>
> +      { "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel,},<br>
>        { "reloc_signed_4byte", 0, 4 * 8, 0},<br>
> -      { "reloc_global_offset_table", 0, 4 * 8, 0}<br>
> +      { "reloc_global_offset_table", 0, 4 * 8, 0},<br>
> +      { "reloc_global_offset_table8", 0, 8 * 8, 0},<br>
>      };<br>
><br>
>      if (Kind < FirstTargetFixupKind)<br>
> @@ -423,6 +424,14 @@ public:<br>
>      , Is64Bit(is64Bit) {<br>
>    }<br>
><br>
> +  Optional<MCFixupKind> getFixupKind(StringRef Name) const override {<br>
> +    return StringSwitch<Optional<MCFixupKind>>(Name)<br>
> +        .Case("dir32", FK_Data_4)<br>
> +        .Case("secrel32", FK_SecRel_4)<br>
> +        .Case("secidx", FK_SecRel_2)<br>
> +        .Default(MCAsmBackend::getFixupKind(Name));<br>
> +  }<br>
> +<br>
>    MCObjectWriter *createObjectWriter(raw_pwrite_stream &OS) const override {<br>
>      return createX86WinCOFFObjectWriter(OS, Is64Bit);<br>
>    }<br>
> @@ -821,7 +830,7 @@ MCAsmBackend *llvm::createX86_32AsmBacke<br>
>    if (TheTriple.isOSBinFormatMachO())<br>
>      return new DarwinX86_32AsmBackend(T, MRI, CPU);<br>
><br>
> -  if (TheTriple.isOSWindows() && !TheTriple.isOSBinFormatELF())<br>
> +  if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF())<br>
>      return new WindowsX86AsmBackend(T, false, CPU);<br>
><br>
>    uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());<br>
> @@ -844,7 +853,7 @@ MCAsmBackend *llvm::createX86_64AsmBacke<br>
>      return new DarwinX86_64AsmBackend(T, MRI, CPU, CS);<br>
>    }<br>
><br>
> -  if (TheTriple.isOSWindows() && !TheTriple.isOSBinFormatELF())<br>
> +  if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF())<br>
>      return new WindowsX86AsmBackend(T, true, CPU);<br>
><br>
>    uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());<br>
><br>
> Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp?rev=258216&r1=258215&r2=258216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp?rev=258216&r1=258215&r2=258216&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp (original)<br>
> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp Tue Jan 19 17:05:27 2016<br>
> @@ -58,6 +58,8 @@ unsigned X86WinCOFFObjectWriter::getRelo<br>
>      case X86::reloc_signed_4byte:<br>
>        if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)<br>
>          return COFF::IMAGE_REL_AMD64_ADDR32NB;<br>
> +      if (Modifier == MCSymbolRefExpr::VK_SECREL)<br>
> +        return COFF::IMAGE_REL_AMD64_SECREL;<br>
>        return COFF::IMAGE_REL_AMD64_ADDR32;<br>
>      case FK_Data_8:<br>
>        return COFF::IMAGE_REL_AMD64_ADDR64;<br>
> @@ -78,6 +80,8 @@ unsigned X86WinCOFFObjectWriter::getRelo<br>
>      case X86::reloc_signed_4byte:<br>
>        if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)<br>
>          return COFF::IMAGE_REL_I386_DIR32NB;<br>
> +      if (Modifier == MCSymbolRefExpr::VK_SECREL)<br>
> +        return COFF::IMAGE_REL_AMD64_SECREL;<br>
>        return COFF::IMAGE_REL_I386_DIR32;<br>
>      case FK_SecRel_2:<br>
>        return COFF::IMAGE_REL_I386_SECTION;<br>
><br>
> Added: llvm/trunk/test/MC/Mips/reloc-directive-negative.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/reloc-directive-negative.s?rev=258216&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/reloc-directive-negative.s?rev=258216&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/MC/Mips/reloc-directive-negative.s (added)<br>
> +++ llvm/trunk/test/MC/Mips/reloc-directive-negative.s Tue Jan 19 17:05:27 2016<br>
> @@ -0,0 +1,6 @@<br>
> +# RUN: not llvm-mc -triple mips-unknown-linux < %s -show-encoding -target-abi=o32 \<br>
> +# RUN:     2>&1 | FileCheck %s<br>
> +       .text<br>
> +foo:<br>
> +       .reloc -1, R_MIPS_32, .text # CHECK: :[[@LINE]]:9: error: expression is negative<br>
> +       nop<br>
><br>
> Added: llvm/trunk/test/MC/X86/reloc-directive.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/reloc-directive.s?rev=258216&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/reloc-directive.s?rev=258216&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/MC/X86/reloc-directive.s (added)<br>
> +++ llvm/trunk/test/MC/X86/reloc-directive.s Tue Jan 19 17:05:27 2016<br>
> @@ -0,0 +1,40 @@<br>
> +# RUN: llvm-mc -triple i686-pc-win32 < %s -show-encoding \<br>
> +# RUN:     | FileCheck -check-prefix=ASM %s<br>
> +# RUN: llvm-mc -triple i686-pc-win32 < %s -show-encoding \<br>
> +# RUN:     -filetype=obj | llvm-readobj -sections -section-data -r | \<br>
> +# RUN:     FileCheck -check-prefix=OBJ-32 %s<br>
> +# RUN: llvm-mc -triple x86_64-pc-win32 < %s -show-encoding \<br>
> +# RUN:     -filetype=obj | llvm-readobj -sections -section-data -r | \<br>
> +# RUN:     FileCheck -check-prefix=OBJ-64 %s<br>
> +       .text<br>
> +foo:<br>
> +       .long 0<br>
> +       .long 0<br>
> +       .long 0<br>
> +       .long 0<br>
> +       .long 0<br>
> +       .reloc 4, dir32,    foo          # ASM: .reloc 4, dir32, foo<br>
> +       .reloc 0, secrel32, foo+4        # ASM: .reloc 0, secrel32, foo+4<br>
> +       .reloc 8, secidx,   foo+8        # ASM: .reloc 8, secidx, foo+8<br>
> +       .reloc 12, dir32,   foo@secrel32 # ASM: .reloc 12, dir32, foo@SECREL32<br>
> +       .reloc 16, dir32,   foo@imgrel   # ASM: .reloc 16, dir32, foo@IMGREL<br>
> +<br>
> +# OBJ-32-LABEL: Name: .text<br>
> +# OBJ-32:       0000: 04000000 00000000 08000000<br>
> +# OBJ-32-LABEL: }<br>
> +# OBJ-32-LABEL: Relocations [<br>
> +# OBJ-32:       0x4  IMAGE_REL_I386_DIR32   foo<br>
> +# OBJ-32:       0x0  IMAGE_REL_I386_SECREL  foo<br>
> +# OBJ-32:       0x8  IMAGE_REL_I386_SECTION foo<br>
> +# OBJ-32:       0xC  IMAGE_REL_I386_SECREL  foo<br>
> +# OBJ-32:       0x10 IMAGE_REL_I386_DIR32NB foo<br>
> +<br>
> +# OBJ-64-LABEL: Name: .text<br>
> +# OBJ-64:       0000: 04000000 00000000 08000000<br>
> +# OBJ-64-LABEL: }<br>
> +# OBJ-64-LABEL: Relocations [<br>
> +# OBJ-64:       0x4  IMAGE_REL_AMD64_ADDR32   foo<br>
> +# OBJ-64:       0x0  IMAGE_REL_AMD64_SECREL   foo<br>
> +# OBJ-64:       0x8  IMAGE_REL_AMD64_SECTION  foo<br>
> +# OBJ-64:       0xC  IMAGE_REL_AMD64_SECREL   foo<br>
> +# OBJ-64:       0x10 IMAGE_REL_AMD64_ADDR32NB foo<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>