.secidx works for me. I looked at the gas docs and didn't find anything similar and it just looks like gas doesn't support that part of the pe format.<div><br></div><div><div>One nit I noticed:</div><div><br></div>
<div><span style="line-height:19.799999237060547px">+void WinCOFFStreamer::</span><u style="line-height:19.799999237060547px"></u><span style="line-height:19.799999237060547px">EmitCOFFSecti</span><span style="line-height:19.799999237060547px">onIndex(MCSymbol const *Symbol)</span><br style="line-height:19.799999237060547px">
<span style="line-height:19.799999237060547px">+{</span><br style="line-height:19.799999237060547px"></div><div><span style="line-height:19.799999237060547px"><br></span></div><div><span style="line-height:19.799999237060547px">formatting?</span></div>
<div><br></div><div>-eric</div></div><br><div>On Fri Dec 20 2013 at 10:20:40 AM, Timur Iskhodzhanov <<a href="mailto:timurrrr@google.com">timurrrr@google.com</a>> wrote:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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>project?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>com/D2445</a><br>
<br>
Modified:<br>
    llvm/trunk/docs/Extensions.rst<br>
    llvm/trunk/include/llvm/MC/<u></u>MCStreamer.h<br>
    llvm/trunk/lib/MC/<u></u>MCAsmStreamer.cpp<br>
    llvm/trunk/lib/MC/MCParser/<u></u>COFFAsmParser.cpp<br>
    llvm/trunk/lib/MC/MCStreamer.<u></u>cpp<br>
    llvm/trunk/lib/MC/<u></u>WinCOFFStreamer.cpp<br>
    llvm/trunk/lib/Target/X86/<u></u>MCTargetDesc/<u></u>X86WinCOFFObjectWriter.cpp<br>
<br>
Modified: llvm/trunk/docs/Extensions.rst<br>
URL: <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>project/llvm/trunk/docs/<u></u>Extensions.rst?rev=197826&r1=<u></u>197825&r2=197826&view=diff</a><br>

==============================<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 that<br>
 corresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB`` (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 relocation<br>
+types ``IMAGE_REL_I386_SECREL`` (32-bit) or ``IMAGE_REL_AMD64_SECREL`` (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`` (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>^^^^^^^^^^^^^^^^^^^^^^<br>
<br>
Modified: llvm/trunk/include/llvm/MC/<u></u>MCStreamer.h<br>
URL: <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>project/llvm/trunk/include/<u></u>llvm/MC/MCStreamer.h?rev=<u></u>197826&r1=197825&r2=197826&<u></u>view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/MC/<u></u>MCStreamer.h (original)<br>
+++ llvm/trunk/include/llvm/MC/<u></u>MCStreamer.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 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 to.<br>
<br>
Modified: llvm/trunk/lib/MC/<u></u>MCAsmStreamer.cpp<br>
URL: <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>project/llvm/trunk/lib/MC/<u></u>MCAsmStreamer.cpp?rev=197826&<u></u>r1=197825&r2=197826&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/MC/<u></u>MCAsmStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/<u></u>MCAsmStreamer.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>EndCOFFSymbolDef() {<br>
   EmitEOL();<br>
 }<br>
<br>
+void MCAsmStreamer::<u></u>EmitCOFFSectionIndex(MCSymbol const *Symbol) {<br>
+  OS << "\t.secidx\t" << *Symbol;<br>
+  EmitEOL();<br>
+}<br>
+<br>
 void MCAsmStreamer::<u></u>EmitCOFFSecRel32(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>COFFAsmParser.cpp<br>
URL: <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>project/llvm/trunk/lib/MC/<u></u>MCParser/COFFAsmParser.cpp?<u></u>rev=197826&r1=197825&r2=<u></u>197826&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/MC/MCParser/<u></u>COFFAsmParser.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCParser/<u></u>COFFAsmParser.cpp Fri Dec 20 12:15:00 2013<br>
@@ -55,6 +55,7 @@ class COFFAsmParser : public MCAsmParser<br>
     addDirectiveHandler<&<u></u>COFFAsmParser::<u></u>ParseDirectiveType>(".type");<br>
     addDirectiveHandler<&<u></u>COFFAsmParser::<u></u>ParseDirectiveEndef>(".endef")<u></u>;<br>
     addDirectiveHandler<&<u></u>COFFAsmParser::<u></u>ParseDirectiveSecRel32>(".<u></u>secrel32");<br>
+    addDirectiveHandler<&<u></u>COFFAsmParser::<u></u>ParseDirectiveSecIdx>(".<u></u>secidx");<br>
     addDirectiveHandler<&<u></u>COFFAsmParser::<u></u>ParseDirectiveLinkOnce>(".<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>StringRef, SMLoc);<br>
+  bool ParseDirectiveSecIdx(<u></u>StringRef, SMLoc);<br>
   bool parseCOMDATTypeAndAssoc(COFF::<u></u>COMDATType &Type,<br>
                                const MCSectionCOFF *&Assoc);<br>
   bool ParseDirectiveLinkOnce(<u></u>StringRef, SMLoc);<br>
@@ -432,7 +434,7 @@ bool COFFAsmParser::<u></u>ParseDirectiveEndef(<br>
 bool COFFAsmParser::<u></u>ParseDirectiveSecRel32(<u></u>StringRef, SMLoc) {<br>
   StringRef SymbolID;<br>
   if (getParser().parseIdentifier(<u></u>SymbolID))<br>
-    return true;<br>
+    return TokError("expected identifier in directive");<br>
<br>
   if (getLexer().isNot(AsmToken::<u></u>EndOfStatement))<br>
     return TokError("unexpected token in directive");<br>
@@ -444,6 +446,21 @@ bool COFFAsmParser::<u></u>ParseDirectiveSecRel<br>
   return false;<br>
 }<br>
<br>
+bool COFFAsmParser::<u></u>ParseDirectiveSecIdx(<u></u>StringRef, SMLoc) {<br>
+  StringRef SymbolID;<br>
+  if (getParser().parseIdentifier(<u></u>SymbolID))<br>
+    return TokError("expected identifier in directive");<br>
+<br>
+  if (getLexer().isNot(AsmToken::<u></u>EndOfStatement))<br>
+    return TokError("unexpected token in directive");<br>
+<br>
+  MCSymbol *Symbol = getContext().<u></u>GetOrCreateSymbol(SymbolID);<br>
+<br>
+  Lex();<br>
+  getStreamer().<u></u>EmitCOFFSectionIndex(Symbol);<br>
+  return false;<br>
+}<br>
+<br>
 /// ::= [ identifier [ identifier ] ]<br>
 bool COFFAsmParser::<u></u>parseCOMDATTypeAndAssoc(COFF::<u></u>COMDATType &Type,<br>
                                             const MCSectionCOFF *&Assoc) {<br>
<br>
Modified: llvm/trunk/lib/MC/MCStreamer.<u></u>cpp<br>
URL: <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>project/llvm/trunk/lib/MC/<u></u>MCStreamer.cpp?rev=197826&r1=<u></u>197825&r2=197826&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/MC/MCStreamer.<u></u>cpp (original)<br>
+++ llvm/trunk/lib/MC/MCStreamer.<u></u>cpp Fri Dec 20 12:15:00 2013<br>
@@ -566,6 +566,10 @@ void MCStreamer::<u></u>EmitWin64EHEndProlog()<br>
   EmitLabel(CurFrame->PrologEnd)<u></u>;<br>
 }<br>
<br>
+void MCStreamer::<u></u>EmitCOFFSectionIndex(MCSymbol const *Symbol) {<br>
+  llvm_unreachable("This file format doesn't support this directive");<br>
+}<br>
+<br>
 void MCStreamer::EmitCOFFSecRel32(<u></u>MCSymbol const *Symbol) {<br>
   llvm_unreachable("This file format doesn't support this directive");<br>
 }<br>
<br>
Modified: llvm/trunk/lib/MC/<u></u>WinCOFFStreamer.cpp<br>
URL: <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>project/llvm/trunk/lib/MC/<u></u>WinCOFFStreamer.cpp?rev=<u></u>197826&r1=197825&r2=197826&<u></u>view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/MC/<u></u>WinCOFFStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/<u></u>WinCOFFStreamer.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>EndCOFFSymbolDef()<br>
   CurSymbol = NULL;<br>
 }<br>
<br>
+void WinCOFFStreamer::<u></u>EmitCOFFSectionIndex(MCSymbol const *Symbol)<br>
+{<br>
+  MCDataFragment *DF = getOrCreateDataFragment();<br>
+<br>
+  DF->getFixups().push_back(<br>
+      MCFixup::Create(DF-><u></u>getContents().size(),<br>
+                      MCSymbolRefExpr::Create (Symbol, getContext ()),<br>
+                      FK_SecRel_2));<br>
+  DF->getContents().resize(DF-><u></u>getContents().size() + 4, 0);<br>
+}<br>
+<br>
 void WinCOFFStreamer::<u></u>EmitCOFFSecRel32(MCSymbol const *Symbol)<br>
 {<br>
   MCDataFragment *DF = getOrCreateDataFragment();<br>
<br>
Modified: llvm/trunk/lib/Target/X86/<u></u>MCTargetDesc/<u></u>X86WinCOFFObjectWriter.cpp<br>
URL: <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>project/llvm/trunk/lib/Target/<u></u>X86/MCTargetDesc/<u></u>X86WinCOFFObjectWriter.cpp?<u></u>rev=197826&r1=197825&r2=<u></u>197826&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/Target/X86/<u></u>MCTargetDesc/<u></u>X86WinCOFFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/<u></u>MCTargetDesc/<u></u>X86WinCOFFObjectWriter.cpp Fri Dec 20 12:15:00 2013<br>
@@ -65,6 +65,9 @@ unsigned X86WinCOFFObjectWriter::<u></u>getRelo<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 : COFF::IMAGE_REL_I386_SECREL;<br>
   default:<br>
<br>
<br>
______________________________<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>mailman/listinfo/llvm-commits</a><br>
</blockquote>