[llvm] r197826 - [COFF] Add support for the .secidx directive
Eric Christopher
echristo at gmail.com
Fri Dec 20 12:42:35 PST 2013
Nevermind. I saw 197828.
On Fri Dec 20 2013 at 12:42:19 PM, Eric Christopher <echristo at gmail.com>
wrote:
> Ah, one more, this needs a testcase. Thanks.
>
> On Fri Dec 20 2013 at 12:23:14 PM, Timur Iskhodzhanov <timurrrr at google.com>
> wrote:
>
> 2013/12/21 Eric Christopher <echristo at gmail.com>:
> > .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.
>
> yep, agreed
>
> > One nit I noticed:
> >
> > +void WinCOFFStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol)
> > +{
> >
> > formatting?
>
> oops.
> Fixed in r197831, along with the source of the "misformatting by
> copy-and-paste".
>
>
> > -eric
> >
> > On Fri Dec 20 2013 at 10:20:40 AM, Timur Iskhodzhanov <
> timurrrr at google.com>
> > wrote:
> >>
> >> Author: timurrrr
> >> Date: Fri Dec 20 12:15:00 2013
> >> New Revision: 197826
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=197826&view=rev
> >> Log:
> >> [COFF] Add support for the .secidx directive
> >>
> >> Reviewed at http://llvm-reviews.chandlerc.com/D2445
> >>
> >> Modified:
> >> llvm/trunk/docs/Extensions.rst
> >> llvm/trunk/include/llvm/MC/MCStreamer.h
> >> llvm/trunk/lib/MC/MCAsmStreamer.cpp
> >> llvm/trunk/lib/MC/MCParser/COFFAsmParser.cpp
> >> llvm/trunk/lib/MC/MCStreamer.cpp
> >> llvm/trunk/lib/MC/WinCOFFStreamer.cpp
> >> llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
> >>
> >> Modified: llvm/trunk/docs/Extensions.rst
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/Extensio
> ns.rst?rev=197826&r1=197825&r2=197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/docs/Extensions.rst (original)
> >> +++ llvm/trunk/docs/Extensions.rst Fri Dec 20 12:15:00 2013
> >> @@ -37,7 +37,7 @@ X86/COFF-Dependent
> >> Relocations
> >> ^^^^^^^^^^^
> >>
> >> -The following additional relocation type is supported:
> >> +The following additional relocation types are supported:
> >>
> >> **@IMGREL** (AT&T syntax only) generates an image-relative relocation
> >> that
> >> corresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB``
> >> (32-bit) or
> >> @@ -54,6 +54,22 @@ corresponds to the COFF relocation types
> >> .long (fun at imgrel + 0x3F)
> >> .long $unwind$fun at imgrel
> >>
> >> +**.secrel32** generates a relocation that corresponds to the COFF
> >> relocation
> >> +types ``IMAGE_REL_I386_SECREL`` (32-bit) or ``IMAGE_REL_AMD64_SECREL``
> >> (64-bit).
> >> +
> >> +**.secidx** relocation generates an index of the section that contains
> >> +the target. It corresponds to the COFF relocation types
> >> +``IMAGE_REL_I386_SECTION`` (32-bit) or ``IMAGE_REL_AMD64_SECTION``
> >> (64-bit).
> >> +
> >> +.. code-block:: gas
> >> +
> >> + .section .debug$S,"rn"
> >> + .long 4
> >> + .long 242
> >> + .long 40
> >> + .secrel32 _function_name
> >> + .secidx _function_name
> >> + ...
> >>
> >> ``.linkonce`` Directive
> >> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >>
> >> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
> MC/MCStreamer.h?rev=197826&r1=197825&r2=197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> >> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Fri Dec 20 12:15:00 2013
> >> @@ -411,6 +411,11 @@ public:
> >> /// EndCOFFSymbolDef - Marks the end of the symbol definition.
> >> virtual void EndCOFFSymbolDef() = 0;
> >>
> >> + /// EmitCOFFSectionIndex - Emits a COFF section index.
> >> + ///
> >> + /// @param Symbol - Symbol the section number relocation should point
> >> to.
> >> + virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol);
> >> +
> >> /// EmitCOFFSecRel32 - Emits a COFF section relative relocation.
> >> ///
> >> /// @param Symbol - Symbol the section relative relocation should
> point
> >> to.
> >>
> >> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmS
> treamer.cpp?rev=197826&r1=197825&r2=197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> >> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Fri Dec 20 12:15:00 2013
> >> @@ -160,6 +160,7 @@ public:
> >> virtual void EmitCOFFSymbolStorageClass(int StorageClass);
> >> virtual void EmitCOFFSymbolType(int Type);
> >> virtual void EndCOFFSymbolDef();
> >> + virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol);
> >> virtual void EmitCOFFSecRel32(MCSymbol const *Symbol);
> >> virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value);
> >> virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
> >> @@ -505,8 +506,13 @@ void MCAsmStreamer::EndCOFFSymbolDef() {
> >> EmitEOL();
> >> }
> >>
> >> +void MCAsmStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) {
> >> + OS << "\t.secidx\t" << *Symbol;
> >> + EmitEOL();
> >> +}
> >> +
> >> void MCAsmStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) {
> >> - OS << "\t.secrel32\t" << *Symbol << '\n';
> >> + OS << "\t.secrel32\t" << *Symbol;
> >> EmitEOL();
> >> }
> >>
> >>
> >> Modified: llvm/trunk/lib/MC/MCParser/COFFAsmParser.cpp
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCPars
> er/COFFAsmParser.cpp?rev=197826&r1=197825&r2=197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/lib/MC/MCParser/COFFAsmParser.cpp (original)
> >> +++ llvm/trunk/lib/MC/MCParser/COFFAsmParser.cpp Fri Dec 20 12:15:00
> 2013
> >> @@ -55,6 +55,7 @@ class COFFAsmParser : public MCAsmParser
> >> addDirectiveHandler<&COFFAsmParser::ParseDirectiveType>(".type");
> >> addDirectiveHandler<&COFFAsmParser::ParseDirectiveEndef>(".endef")
> ;
> >>
> >> addDirectiveHandler<&COFFAsmParser::ParseDirectiveSecRel32>(".
> secrel32");
> >> + addDirectiveHandler<&COFFAsmParser::ParseDirectiveSecIdx>(".
> secidx");
> >>
> >> addDirectiveHandler<&COFFAsmParser::ParseDirectiveLinkOnce>(".
> linkonce");
> >>
> >> // Win64 EH directives.
> >> @@ -115,6 +116,7 @@ class COFFAsmParser : public MCAsmParser
> >> bool ParseDirectiveType(StringRef, SMLoc);
> >> bool ParseDirectiveEndef(StringRef, SMLoc);
> >> bool ParseDirectiveSecRel32(StringRef, SMLoc);
> >> + bool ParseDirectiveSecIdx(StringRef, SMLoc);
> >> bool parseCOMDATTypeAndAssoc(COFF::COMDATType &Type,
> >> const MCSectionCOFF *&Assoc);
> >> bool ParseDirectiveLinkOnce(StringRef, SMLoc);
> >> @@ -432,7 +434,7 @@ bool COFFAsmParser::ParseDirectiveEndef(
> >> bool COFFAsmParser::ParseDirectiveSecRel32(StringRef, SMLoc) {
> >> StringRef SymbolID;
> >> if (getParser().parseIdentifier(SymbolID))
> >> - return true;
> >> + return TokError("expected identifier in directive");
> >>
> >> if (getLexer().isNot(AsmToken::EndOfStatement))
> >> return TokError("unexpected token in directive");
> >> @@ -444,6 +446,21 @@ bool COFFAsmParser::ParseDirectiveSecRel
> >> return false;
> >> }
> >>
> >> +bool COFFAsmParser::ParseDirectiveSecIdx(StringRef, SMLoc) {
> >> + StringRef SymbolID;
> >> + if (getParser().parseIdentifier(SymbolID))
> >> + return TokError("expected identifier in directive");
> >> +
> >> + if (getLexer().isNot(AsmToken::EndOfStatement))
> >> + return TokError("unexpected token in directive");
> >> +
> >> + MCSymbol *Symbol = getContext().GetOrCreateSymbol(SymbolID);
> >> +
> >> + Lex();
> >> + getStreamer().EmitCOFFSectionIndex(Symbol);
> >> + return false;
> >> +}
> >> +
> >> /// ::= [ identifier [ identifier ] ]
> >> bool COFFAsmParser::parseCOMDATTypeAndAssoc(COFF::COMDATType &Type,
> >> const MCSectionCOFF
> *&Assoc)
> >> {
> >>
> >> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStre
> amer.cpp?rev=197826&r1=197825&r2=197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> >> +++ llvm/trunk/lib/MC/MCStreamer.cpp Fri Dec 20 12:15:00 2013
> >> @@ -566,6 +566,10 @@ void MCStreamer::EmitWin64EHEndProlog()
> >> EmitLabel(CurFrame->PrologEnd);
> >> }
> >>
> >> +void MCStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) {
> >> + llvm_unreachable("This file format doesn't support this directive");
> >> +}
> >> +
> >> void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) {
> >> llvm_unreachable("This file format doesn't support this directive");
> >> }
> >>
> >> Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOF
> FStreamer.cpp?rev=197826&r1=197825&r2=197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
> >> +++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Fri Dec 20 12:15:00 2013
> >> @@ -61,6 +61,7 @@ public:
> >> virtual void EmitCOFFSymbolStorageClass(int StorageClass);
> >> virtual void EmitCOFFSymbolType(int Type);
> >> virtual void EndCOFFSymbolDef();
> >> + virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol);
> >> virtual void EmitCOFFSecRel32(MCSymbol const *Symbol);
> >> virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value);
> >> virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
> >> @@ -249,6 +250,17 @@ void WinCOFFStreamer::EndCOFFSymbolDef()
> >> CurSymbol = NULL;
> >> }
> >>
> >> +void WinCOFFStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol)
> >> +{
> >> + MCDataFragment *DF = getOrCreateDataFragment();
> >> +
> >> + DF->getFixups().push_back(
> >> + MCFixup::Create(DF->getContents().size(),
> >> + MCSymbolRefExpr::Create (Symbol, getContext ()),
> >> + FK_SecRel_2));
> >> + DF->getContents().resize(DF->getContents().size() + 4, 0);
> >> +}
> >> +
> >> void WinCOFFStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol)
> >> {
> >> MCDataFragment *DF = getOrCreateDataFragment();
> >>
> >> Modified:
> >> llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
> >> URL:
> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X8
> 6/MCTargetDesc/X86WinCOFFObjectWriter.cpp?rev=197826&r1=197825&r2=
> 197826&view=diff
> >>
> >> ============================================================
> ==================
> >> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
> >> (original)
> >> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
> Fri
> >> Dec 20 12:15:00 2013
> >> @@ -65,6 +65,9 @@ unsigned X86WinCOFFObjectWriter::getRelo
> >> if (Is64Bit)
> >> return COFF::IMAGE_REL_AMD64_ADDR64;
> >> llvm_unreachable("unsupported relocation type");
> >> + case FK_SecRel_2:
> >> + return Is64Bit ? COFF::IMAGE_REL_AMD64_SECTION
> >> + : COFF::IMAGE_REL_I386_SECTION;
> >> case FK_SecRel_4:
> >> return Is64Bit ? COFF::IMAGE_REL_AMD64_SECREL :
> >> COFF::IMAGE_REL_I386_SECREL;
> >> default:
> >>
> >>
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131220/f73b2f0c/attachment.html>
More information about the llvm-commits
mailing list