.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>