Nevermind. I saw 197828.<br><br><div>On Fri Dec 20 2013 at 12:42:19 PM, Eric Christopher <<a href="mailto:echristo@gmail.com">echristo@gmail.com</a>> wrote:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Ah, one more, this needs a testcase. Thanks.<br><br><div>On Fri Dec 20 2013 at 12:23:14 PM, Timur Iskhodzhanov <<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@google.com</a>> wrote:</div><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2013/12/21 Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>>:<br>
> .secidx works for me. I looked at the gas docs and didn't find anything<br>
> similar and it just looks like gas doesn't support that part of the pe<br>
> format.<br>
<br>
yep, agreed<br>
<br>
> One nit I noticed:<br>
><br>
> +void WinCOFFStreamer::<u></u>EmitCOFFSecti<u></u>onIndex(MCSymbol const *Symbol)<br>
> +{<br>
><br>
> formatting?<br>
<br>
oops.<br>
Fixed in r197831, along with the source of the "misformatting by<br>
copy-and-paste".<br>
<br>
<br>
> -eric<br>
><br>
> On Fri Dec 20 2013 at 10:20:40 AM, Timur Iskhodzhanov <<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@google.com</a>><br>
> wrote:<br>
>><br>
>> Author: timurrrr<br>
>> Date: Fri Dec 20 12:15:00 2013<br>
>> New Revision: 197826<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=197826&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject?rev=197826&view=rev</a><br>
>> Log:<br>
>> [COFF] Add support for the .secidx directive<br>
>><br>
>> Reviewed at <a href="http://llvm-reviews.chandlerc.com/D2445" target="_blank">http://llvm-reviews.chandlerc.<u></u><u></u>com/D2445</a><br>
>><br>
>> Modified:<br>
>>     llvm/trunk/docs/Extensions.rst<br>
>>     llvm/trunk/include/llvm/MC/<u></u>MCS<u></u>treamer.h<br>
>>     llvm/trunk/lib/MC/<u></u>MCAsmStreame<u></u>r.cpp<br>
>>     llvm/trunk/lib/MC/MCParser/<u></u>COF<u></u>FAsmParser.cpp<br>
>>     llvm/trunk/lib/MC/MCStreamer.<u></u>c<u></u>pp<br>
>>     llvm/trunk/lib/MC/<u></u>WinCOFFStrea<u></u>mer.cpp<br>
>>     llvm/trunk/lib/Target/X86/<u></u>MCTa<u></u>rgetDesc/<u></u>X86WinCOFFObjectWrite<u></u>r.cpp<br>
>><br>
>> Modified: llvm/trunk/docs/Extensions.rst<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/Extensions.rst?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/docs/<u></u>Extensio<u></u>ns.rst?rev=197826&r1=<u></u>197825&<u></u>r2=197826&view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/docs/Extensions.rst (original)<br>
>> +++ llvm/trunk/docs/Extensions.rst Fri Dec 20 12:15:00 2013<br>
>> @@ -37,7 +37,7 @@ X86/COFF-Dependent<br>
>>  Relocations<br>
>>  ^^^^^^^^^^^<br>
>><br>
>> -The following additional relocation type is supported:<br>
>> +The following additional relocation types are supported:<br>
>><br>
>>  **@IMGREL** (AT&T syntax only) generates an image-relative relocation<br>
>> that<br>
>>  corresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB``<br>
>> (32-bit) or<br>
>> @@ -54,6 +54,22 @@ corresponds to the COFF relocation types<br>
>>      .long (fun@imgrel + 0x3F)<br>
>>      .long $unwind$fun@imgrel<br>
>><br>
>> +**.secrel32** generates a relocation that corresponds to the COFF<br>
>> relocation<br>
>> +types ``IMAGE_REL_I386_SECREL`` (32-bit) or ``IMAGE_REL_AMD64_SECREL``<br>
>> (64-bit).<br>
>> +<br>
>> +**.secidx** relocation generates an index of the section that contains<br>
>> +the target.  It corresponds to the COFF relocation types<br>
>> +``IMAGE_REL_I386_SECTION`` (32-bit) or ``IMAGE_REL_AMD64_SECTION``<br>
>> (64-bit).<br>
>> +<br>
>> +.. code-block:: gas<br>
>> +<br>
>> +  .section .debug$S,"rn"<br>
>> +    .long 4<br>
>> +    .long 242<br>
>> +    .long 40<br>
>> +    .secrel32 _function_name<br>
>> +    .secidx   _function_name<br>
>> +    ...<br>
>><br>
>>  ``.linkonce`` Directive<br>
>>  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<u></u>^<u></u>^^^^^^^^^^^^^^^^^^^^^^<br>
>><br>
>> Modified: llvm/trunk/include/llvm/MC/<u></u>MCS<u></u>treamer.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/include/<u></u>llvm/<u></u>MC/MCStreamer.h?rev=<u></u>197826&r1=<u></u>197825&r2=197826&<u></u>view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/include/llvm/MC/<u></u>MCS<u></u>treamer.h (original)<br>
>> +++ llvm/trunk/include/llvm/MC/<u></u>MCS<u></u>treamer.h Fri Dec 20 12:15:00 2013<br>
>> @@ -411,6 +411,11 @@ public:<br>
>>    /// EndCOFFSymbolDef - Marks the end of the symbol definition.<br>
>>    virtual void EndCOFFSymbolDef() = 0;<br>
>><br>
>> +  /// EmitCOFFSectionIndex - Emits a COFF section index.<br>
>> +  ///<br>
>> +  /// @param Symbol - Symbol the section number relocation should point<br>
>> to.<br>
>> +  virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol);<br>
>> +<br>
>>    /// EmitCOFFSecRel32 - Emits a COFF section relative relocation.<br>
>>    ///<br>
>>    /// @param Symbol - Symbol the section relative relocation should point<br>
>> to.<br>
>><br>
>> Modified: llvm/trunk/lib/MC/<u></u>MCAsmStreame<u></u>r.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/lib/MC/<u></u>MCAsmS<u></u>treamer.cpp?rev=197826&<u></u>r1=<u></u>197825&r2=197826&view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/lib/MC/<u></u>MCAsmStreame<u></u>r.cpp (original)<br>
>> +++ llvm/trunk/lib/MC/<u></u>MCAsmStreame<u></u>r.cpp Fri Dec 20 12:15:00 2013<br>
>> @@ -160,6 +160,7 @@ public:<br>
>>    virtual void EmitCOFFSymbolStorageClass(int StorageClass);<br>
>>    virtual void EmitCOFFSymbolType(int Type);<br>
>>    virtual void EndCOFFSymbolDef();<br>
>> +  virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol);<br>
>>    virtual void EmitCOFFSecRel32(MCSymbol const *Symbol);<br>
>>    virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value);<br>
>>    virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,<br>
>> @@ -505,8 +506,13 @@ void MCAsmStreamer::<u></u>EndCOFFSymbolDe<u></u>f() {<br>
>>    EmitEOL();<br>
>>  }<br>
>><br>
>> +void MCAsmStreamer::<u></u>EmitCOFFSection<u></u>Index(MCSymbol const *Symbol) {<br>
>> +  OS << "\t.secidx\t" << *Symbol;<br>
>> +  EmitEOL();<br>
>> +}<br>
>> +<br>
>>  void MCAsmStreamer::<u></u>EmitCOFFSecRel3<u></u>2(MCSymbol const *Symbol) {<br>
>> -  OS << "\t.secrel32\t" << *Symbol << '\n';<br>
>> +  OS << "\t.secrel32\t" << *Symbol;<br>
>>    EmitEOL();<br>
>>  }<br>
>><br>
>><br>
>> Modified: llvm/trunk/lib/MC/MCParser/<u></u>COF<u></u>FAsmParser.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/COFFAsmParser.cpp?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/lib/MC/<u></u>MCPars<u></u>er/COFFAsmParser.cpp?<u></u>rev=<u></u>197826&r1=197825&r2=<u></u>197826&<u></u>view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/lib/MC/MCParser/<u></u>COF<u></u>FAsmParser.cpp (original)<br>
>> +++ llvm/trunk/lib/MC/MCParser/<u></u>COF<u></u>FAsmParser.cpp Fri Dec 20 12:15:00 2013<br>
>> @@ -55,6 +55,7 @@ class COFFAsmParser : public MCAsmParser<br>
>>      addDirectiveHandler<&<u></u>COFFAsmP<u></u>arser::<u></u>ParseDirectiveType>(".<u></u>type");<br>
>>      addDirectiveHandler<&<u></u>COFFAsmP<u></u>arser::<u></u>ParseDirectiveEndef>(".<u></u>endef")<u></u>;<br>
>><br>
>> addDirectiveHandler<&<u></u>COFFAsmPa<u></u>rser::<u></u>ParseDirectiveSecRel32>(<u></u>".<u></u>secrel32");<br>
>> +    addDirectiveHandler<&<u></u>COFFAsmP<u></u>arser::<u></u>ParseDirectiveSecIdx>("<u></u>.<u></u>secidx");<br>
>><br>
>> addDirectiveHandler<&<u></u>COFFAsmPa<u></u>rser::<u></u>ParseDirectiveLinkOnce>(<u></u>".<u></u>linkonce");<br>
>><br>
>>      // Win64 EH directives.<br>
>> @@ -115,6 +116,7 @@ class COFFAsmParser : public MCAsmParser<br>
>>    bool ParseDirectiveType(StringRef, SMLoc);<br>
>>    bool ParseDirectiveEndef(StringRef, SMLoc);<br>
>>    bool ParseDirectiveSecRel32(<u></u>StringR<u></u>ef, SMLoc);<br>
>> +  bool ParseDirectiveSecIdx(<u></u>StringRef<u></u>, SMLoc);<br>
>>    bool parseCOMDATTypeAndAssoc(COFF::<u></u><u></u>COMDATType &Type,<br>
>>                                 const MCSectionCOFF *&Assoc);<br>
>>    bool ParseDirectiveLinkOnce(<u></u>StringR<u></u>ef, SMLoc);<br>
>> @@ -432,7 +434,7 @@ bool COFFAsmParser::<u></u>ParseDirectiveE<u></u>ndef(<br>
>>  bool COFFAsmParser::<u></u>ParseDirectiveS<u></u>ecRel32(<u></u>StringRef, SMLoc) {<br>
>>    StringRef SymbolID;<br>
>>    if (getParser().parseIdentifier(<u></u>S<u></u>ymbolID))<br>
>> -    return true;<br>
>> +    return TokError("expected identifier in directive");<br>
>><br>
>>    if (getLexer().isNot(AsmToken::<u></u>En<u></u>dOfStatement))<br>
>>      return TokError("unexpected token in directive");<br>
>> @@ -444,6 +446,21 @@ bool COFFAsmParser::<u></u>ParseDirectiveS<u></u>ecRel<br>
>>    return false;<br>
>>  }<br>
>><br>
>> +bool COFFAsmParser::<u></u>ParseDirectiveS<u></u>ecIdx(<u></u>StringRef, SMLoc) {<br>
>> +  StringRef SymbolID;<br>
>> +  if (getParser().parseIdentifier(<u></u>S<u></u>ymbolID))<br>
>> +    return TokError("expected identifier in directive");<br>
>> +<br>
>> +  if (getLexer().isNot(AsmToken::<u></u>En<u></u>dOfStatement))<br>
>> +    return TokError("unexpected token in directive");<br>
>> +<br>
>> +  MCSymbol *Symbol = getContext().<u></u>GetOrCreateSymbol<u></u>(SymbolID);<br>
>> +<br>
>> +  Lex();<br>
>> +  getStreamer().<u></u>EmitCOFFSection<u></u>Index(Symbol);<br>
>> +  return false;<br>
>> +}<br>
>> +<br>
>>  /// ::= [ identifier [ identifier ] ]<br>
>>  bool COFFAsmParser::<u></u>parseCOMDATType<u></u>AndAssoc(COFF::<u></u>COMDATType &Type,<br>
>>                                              const MCSectionCOFF *&Assoc)<br>
>> {<br>
>><br>
>> Modified: llvm/trunk/lib/MC/MCStreamer.<u></u>c<u></u>pp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/lib/MC/<u></u>MCStre<u></u>amer.cpp?rev=197826&r1=<u></u>197825&<u></u>r2=197826&view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/lib/MC/MCStreamer.<u></u>c<u></u>pp (original)<br>
>> +++ llvm/trunk/lib/MC/MCStreamer.<u></u>c<u></u>pp Fri Dec 20 12:15:00 2013<br>
>> @@ -566,6 +566,10 @@ void MCStreamer::<u></u>EmitWin64EHEndProl<u></u>og()<br>
>>    EmitLabel(CurFrame-><u></u>PrologEnd)<u></u>;<br>
>>  }<br>
>><br>
>> +void MCStreamer::<u></u>EmitCOFFSectionInd<u></u>ex(MCSymbol const *Symbol) {<br>
>> +  llvm_unreachable("This file format doesn't support this directive");<br>
>> +}<br>
>> +<br>
>>  void MCStreamer::EmitCOFFSecRel32(<u></u>M<u></u>CSymbol const *Symbol) {<br>
>>    llvm_unreachable("This file format doesn't support this directive");<br>
>>  }<br>
>><br>
>> Modified: llvm/trunk/lib/MC/<u></u>WinCOFFStrea<u></u>mer.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/lib/MC/<u></u>WinCOF<u></u>FStreamer.cpp?rev=<u></u>197826&r1=<u></u>197825&r2=197826&<u></u>view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/lib/MC/<u></u>WinCOFFStrea<u></u>mer.cpp (original)<br>
>> +++ llvm/trunk/lib/MC/<u></u>WinCOFFStrea<u></u>mer.cpp Fri Dec 20 12:15:00 2013<br>
>> @@ -61,6 +61,7 @@ public:<br>
>>    virtual void EmitCOFFSymbolStorageClass(int StorageClass);<br>
>>    virtual void EmitCOFFSymbolType(int Type);<br>
>>    virtual void EndCOFFSymbolDef();<br>
>> +  virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol);<br>
>>    virtual void EmitCOFFSecRel32(MCSymbol const *Symbol);<br>
>>    virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value);<br>
>>    virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,<br>
>> @@ -249,6 +250,17 @@ void WinCOFFStreamer::<u></u>EndCOFFSymbol<u></u>Def()<br>
>>    CurSymbol = NULL;<br>
>>  }<br>
>><br>
>> +void WinCOFFStreamer::<u></u>EmitCOFFSecti<u></u>onIndex(MCSymbol const *Symbol)<br>
>> +{<br>
>> +  MCDataFragment *DF = getOrCreateDataFragment();<br>
>> +<br>
>> +  DF->getFixups().push_back(<br>
>> +      MCFixup::Create(DF-><u></u>getConten<u></u>ts().size(),<br>
>> +                      MCSymbolRefExpr::Create (Symbol, getContext ()),<br>
>> +                      FK_SecRel_2));<br>
>> +  DF->getContents().resize(DF-><u></u><u></u>getContents().size() + 4, 0);<br>
>> +}<br>
>> +<br>
>>  void WinCOFFStreamer::<u></u>EmitCOFFSecRe<u></u>l32(MCSymbol const *Symbol)<br>
>>  {<br>
>>    MCDataFragment *DF = getOrCreateDataFragment();<br>
>><br>
>> Modified:<br>
>> llvm/trunk/lib/Target/X86/<u></u>MCTa<u></u>rgetDesc/<u></u>X86WinCOFFObjectWrite<u></u>r.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp?rev=197826&r1=197825&r2=197826&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>pr<u></u>oject/llvm/trunk/lib/Target/<u></u>X8<u></u>6/MCTargetDesc/<u></u>X86WinCOFFObjec<u></u>tWriter.cpp?<u></u>rev=197826&r1=<u></u>197825&r2=<u></u>197826&view=diff</a><br>

>><br>
>> ==============================<u></u><u></u>==============================<u></u><u></u>==================<br>
>> --- llvm/trunk/lib/Target/X86/<u></u>MCTa<u></u>rgetDesc/<u></u>X86WinCOFFObjectWrite<u></u>r.cpp<br>
>> (original)<br>
>> +++ llvm/trunk/lib/Target/X86/<u></u>MCTa<u></u>rgetDesc/<u></u>X86WinCOFFObjectWrite<u></u>r.cpp Fri<br>
>> Dec 20 12:15:00 2013<br>
>> @@ -65,6 +65,9 @@ unsigned X86WinCOFFObjectWriter::<u></u>getRel<u></u>o<br>
>>      if (Is64Bit)<br>
>>        return COFF::IMAGE_REL_AMD64_ADDR64;<br>
>>      llvm_unreachable("unsupported relocation type");<br>
>> +  case FK_SecRel_2:<br>
>> +    return Is64Bit ? COFF::IMAGE_REL_AMD64_SECTION<br>
>> +                   : COFF::IMAGE_REL_I386_SECTION;<br>
>>    case FK_SecRel_4:<br>
>>      return Is64Bit ? COFF::IMAGE_REL_AMD64_SECREL :<br>
>> COFF::IMAGE_REL_I386_SECREL;<br>
>>    default:<br>
>><br>
>><br>
>> ______________________________<u></u><u></u>_________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailm<u></u>an/listinfo/llvm-commits</a><br>
</blockquote></blockquote>