[llvm] r197826 - [COFF] Add support for the .secidx directive
Eric Christopher
echristo at gmail.com
Fri Dec 20 12:18:46 PST 2013
.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.
One nit I noticed:
+void WinCOFFStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol)
+{
formatting?
-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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131220/b506f899/attachment.html>
More information about the llvm-commits
mailing list