diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-12-17 01:14:52 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-12-17 01:14:52 +0000 |
commit | 8f7d12ccfd8feb258bdf4e582592bc00beacc7c6 (patch) | |
tree | 9cfa7fc437c2594e922ef79b6f711f2b0a24292f /lib/MC | |
parent | 8b99c1e42cff9a55996907901a5ad81a97f24912 (diff) | |
download | external_llvm-8f7d12ccfd8feb258bdf4e582592bc00beacc7c6.zip external_llvm-8f7d12ccfd8feb258bdf4e582592bc00beacc7c6.tar.gz external_llvm-8f7d12ccfd8feb258bdf4e582592bc00beacc7c6.tar.bz2 |
Add back the MC bits of 126425. Original patch by Nathan Jeffords. I added the
asm parsing and testcase.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146801 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 6 | ||||
-rw-r--r-- | lib/MC/MCLoggingStreamer.cpp | 5 | ||||
-rw-r--r-- | lib/MC/MCNullStreamer.cpp | 1 | ||||
-rw-r--r-- | lib/MC/MCParser/COFFAsmParser.cpp | 17 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 4 | ||||
-rw-r--r-- | lib/MC/WinCOFFObjectWriter.cpp | 4 | ||||
-rw-r--r-- | lib/MC/WinCOFFStreamer.cpp | 14 |
7 files changed, 51 insertions, 0 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index c785c03..630a104 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -154,6 +154,7 @@ public: virtual void EmitCOFFSymbolStorageClass(int StorageClass); virtual void EmitCOFFSymbolType(int Type); virtual void EndCOFFSymbolDef(); + virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment); @@ -470,6 +471,11 @@ void MCAsmStreamer::EndCOFFSymbolDef() { EmitEOL(); } +void MCAsmStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { + OS << "\t.secrel32\t" << *Symbol << '\n'; + EmitEOL(); +} + void MCAsmStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) { assert(MAI.hasDotTypeDotSizeDirective()); OS << "\t.size\t" << *Symbol << ", " << *Value << '\n'; diff --git a/lib/MC/MCLoggingStreamer.cpp b/lib/MC/MCLoggingStreamer.cpp index a7b7947..d59b6d7 100644 --- a/lib/MC/MCLoggingStreamer.cpp +++ b/lib/MC/MCLoggingStreamer.cpp @@ -122,6 +122,11 @@ public: return Child->EndCOFFSymbolDef(); } + virtual void EmitCOFFSecRel32(MCSymbol const *Symbol) { + LogCall("EmitCOFFSecRel32"); + return Child->EmitCOFFSecRel32(Symbol); + } + virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) { LogCall("EmitELFSize"); return Child->EmitELFSize(Symbol, Value); diff --git a/lib/MC/MCNullStreamer.cpp b/lib/MC/MCNullStreamer.cpp index d178b50..ca74663 100644 --- a/lib/MC/MCNullStreamer.cpp +++ b/lib/MC/MCNullStreamer.cpp @@ -55,6 +55,7 @@ namespace { virtual void EmitCOFFSymbolStorageClass(int StorageClass) {} virtual void EmitCOFFSymbolType(int Type) {} virtual void EndCOFFSymbolDef() {} + virtual void EmitCOFFSecRel32(MCSymbol const *Symbol) {} virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {} virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, diff --git a/lib/MC/MCParser/COFFAsmParser.cpp b/lib/MC/MCParser/COFFAsmParser.cpp index 185b516..c4cdc3c 100644 --- a/lib/MC/MCParser/COFFAsmParser.cpp +++ b/lib/MC/MCParser/COFFAsmParser.cpp @@ -45,6 +45,7 @@ class COFFAsmParser : public MCAsmParserExtension { AddDirectiveHandler<&COFFAsmParser::ParseDirectiveScl>(".scl"); AddDirectiveHandler<&COFFAsmParser::ParseDirectiveType>(".type"); AddDirectiveHandler<&COFFAsmParser::ParseDirectiveEndef>(".endef"); + AddDirectiveHandler<&COFFAsmParser::ParseDirectiveSecRel32>(".secrel32"); // Win64 EH directives. AddDirectiveHandler<&COFFAsmParser::ParseSEHDirectiveStartProc>( @@ -102,6 +103,7 @@ class COFFAsmParser : public MCAsmParserExtension { bool ParseDirectiveScl(StringRef, SMLoc); bool ParseDirectiveType(StringRef, SMLoc); bool ParseDirectiveEndef(StringRef, SMLoc); + bool ParseDirectiveSecRel32(StringRef, SMLoc); // Win64 EH directives. bool ParseSEHDirectiveStartProc(StringRef, SMLoc); @@ -217,6 +219,21 @@ bool COFFAsmParser::ParseDirectiveEndef(StringRef, SMLoc) { return false; } +bool COFFAsmParser::ParseDirectiveSecRel32(StringRef, SMLoc) { + StringRef SymbolID; + if (getParser().ParseIdentifier(SymbolID)) + return true; + + if (getLexer().isNot(AsmToken::EndOfStatement)) + return TokError("unexpected token in directive"); + + MCSymbol *Symbol = getContext().GetOrCreateSymbol(SymbolID); + + Lex(); + getStreamer().EmitCOFFSecRel32(Symbol); + return false; +} + bool COFFAsmParser::ParseSEHDirectiveStartProc(StringRef, SMLoc) { StringRef SymbolID; if (getParser().ParseIdentifier(SymbolID)) diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 60a0a9d..74c3e39 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -558,6 +558,10 @@ void MCStreamer::EmitWin64EHEndProlog() { EmitLabel(CurFrame->PrologEnd); } +void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { + assert(0 && "This file format doesn't support this directive"); +} + void MCStreamer::EmitFnStart() { errs() << "Not implemented yet\n"; abort(); diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 4052374..484443a 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -716,6 +716,10 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, else llvm_unreachable("unsupported relocation type"); break; + case X86::reloc_coff_secrel32: + Reloc.Data.Type = Is64Bit ? COFF::IMAGE_REL_AMD64_SREL32 + : COFF::IMAGE_REL_I386_SECREL; + break; default: llvm_unreachable("unsupported relocation type"); } diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index 7409daf..3678a58 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -32,6 +32,9 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" + +#include "../Target/X86/MCTargetDesc/X86FixupKinds.h" + using namespace llvm; namespace { @@ -60,6 +63,7 @@ public: virtual void EmitCOFFSymbolStorageClass(int StorageClass); virtual void EmitCOFFSymbolType(int Type); virtual void EndCOFFSymbolDef(); + virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment); @@ -293,6 +297,16 @@ void WinCOFFStreamer::EndCOFFSymbolDef() { CurSymbol = NULL; } +void WinCOFFStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) +{ + MCDataFragment *DF = getOrCreateDataFragment(); + + DF->addFixup(MCFixup::Create(DF->getContents().size(), + MCSymbolRefExpr::Create (Symbol, getContext ()), + (MCFixupKind)X86::reloc_coff_secrel32)); + DF->getContents().resize(DF->getContents().size() + 4, 0); +} + void WinCOFFStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) { llvm_unreachable("not implemented"); } |