[llvm] r197826 - [COFF] Add support for the .secidx directive

Timur Iskhodzhanov timurrrr at google.com
Fri Dec 20 12:22:44 PST 2013


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/Extensions.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/MCAsmStreamer.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/MCParser/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/MCStreamer.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/WinCOFFStreamer.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/X86/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



More information about the llvm-commits mailing list