From 90eb70c8a76db399d9128a4f70af8cd393374694 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 14 Aug 2015 13:31:17 +0000 Subject: [PATCH] Centralize the information about which object format we are using. Other than some places that were handling unknown as ELF, this should have no change. The test updates are because we were detecting arm-coff or x86_64-win64-coff as ELF targets before. It is not clear if the enum should live on the Triple. At least now it lives in a single location and should be easier to move somewhere else. llvm-svn: 245047 --- llvm/include/llvm/MC/MCObjectFileInfo.h | 4 -- llvm/lib/MC/MCContext.cpp | 10 +++-- llvm/lib/MC/MCObjectFileInfo.cpp | 40 +++++++++--------- llvm/lib/MC/MCParser/AsmParser.cpp | 10 +++-- .../AArch64/AsmParser/AArch64AsmParser.cpp | 8 ++-- .../lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 41 ++++--------------- .../CodeGen/X86/statepoint-stackmap-format.ll | 2 +- .../MC/COFF/ARM/directive-type-diagnostics.s | 10 ----- 8 files changed, 46 insertions(+), 79 deletions(-) delete mode 100644 llvm/test/MC/COFF/ARM/directive-type-diagnostics.s diff --git a/llvm/include/llvm/MC/MCObjectFileInfo.h b/llvm/include/llvm/MC/MCObjectFileInfo.h index b9cea06161d0..571189790d29 100644 --- a/llvm/include/llvm/MC/MCObjectFileInfo.h +++ b/llvm/include/llvm/MC/MCObjectFileInfo.h @@ -331,13 +331,9 @@ public: return EHFrameSection; } - enum Environment { IsMachO, IsELF, IsCOFF }; - Environment getObjectFileType() const { return Env; } - Reloc::Model getRelocM() const { return RelocM; } private: - Environment Env; Reloc::Model RelocM; CodeModel::Model CMModel; MCContext *Ctx; diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index c601c56f3952..e8fb6a95ebe0 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -162,13 +162,15 @@ MCSymbol *MCContext::getOrCreateLSDASymbol(StringRef FuncName) { MCSymbol *MCContext::createSymbolImpl(const StringMapEntry *Name, bool IsTemporary) { if (MOFI) { - switch (MOFI->getObjectFileType()) { - case MCObjectFileInfo::IsCOFF: + switch (MOFI->getTargetTriple().getObjectFormat()) { + case Triple::COFF: return new (Name, *this) MCSymbolCOFF(Name, IsTemporary); - case MCObjectFileInfo::IsELF: + case Triple::ELF: return new (Name, *this) MCSymbolELF(Name, IsTemporary); - case MCObjectFileInfo::IsMachO: + case Triple::MachO: return new (Name, *this) MCSymbolMachO(Name, IsTemporary); + case Triple::UnknownObjectFormat: + break; } } return new (Name, *this) MCSymbol(MCSymbol::SymbolKindUnset, Name, diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp index 576827a72d56..ade4b496ec7f 100644 --- a/llvm/lib/MC/MCObjectFileInfo.cpp +++ b/llvm/lib/MC/MCObjectFileInfo.cpp @@ -767,25 +767,19 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, TT = TheTriple; - Triple::ArchType Arch = TT.getArch(); - // FIXME: Checking for Arch here to filter out bogus triples such as - // cellspu-apple-darwin. Perhaps we should fix in Triple? - if ((Arch == Triple::x86 || Arch == Triple::x86_64 || - Arch == Triple::arm || Arch == Triple::thumb || - Arch == Triple::aarch64 || - Arch == Triple::ppc || Arch == Triple::ppc64 || - Arch == Triple::UnknownArch) && - TT.isOSBinFormatMachO()) { - Env = IsMachO; + Triple::ObjectFormatType Format = TT.getObjectFormat(); + switch (Format) { + case Triple::MachO: initMachOMCObjectFileInfo(TT); - } else if ((Arch == Triple::x86 || Arch == Triple::x86_64 || - Arch == Triple::arm || Arch == Triple::thumb) && - (TT.isOSWindows() && TT.getObjectFormat() == Triple::COFF)) { - Env = IsCOFF; + break; + case Triple::COFF: initCOFFMCObjectFileInfo(TT); - } else { - Env = IsELF; + break; + case Triple::ELF: initELFMCObjectFileInfo(TT); + break; + case Triple::UnknownObjectFormat: + break; } } @@ -801,7 +795,9 @@ MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { } void MCObjectFileInfo::InitEHFrameSection() { - if (Env == IsMachO) + Triple::ObjectFormatType Format = TT.getObjectFormat(); + switch (Format) { + case Triple::MachO: EHFrameSection = Ctx->getMachOSection("__TEXT", "__eh_frame", MachO::S_COALESCED | @@ -809,14 +805,20 @@ void MCObjectFileInfo::InitEHFrameSection() { MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT, SectionKind::getReadOnly()); - else if (Env == IsELF) + break; + case Triple::ELF: EHFrameSection = Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags); - else + break; + case Triple::COFF: EHFrameSection = Ctx->getCOFFSection(".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE, SectionKind::getDataRel()); + break; + case Triple::UnknownObjectFormat: + break; + } } diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 3f45b3d85a38..0089f8f4ebcc 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -513,17 +513,19 @@ AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out, Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)->getBuffer()); // Initialize the platform / file format parser. - switch (Ctx.getObjectFileInfo()->getObjectFileType()) { - case MCObjectFileInfo::IsCOFF: + switch (Ctx.getObjectFileInfo()->getTargetTriple().getObjectFormat()) { + case Triple::COFF: PlatformParser.reset(createCOFFAsmParser()); break; - case MCObjectFileInfo::IsMachO: + case Triple::MachO: PlatformParser.reset(createDarwinAsmParser()); IsDarwin = true; break; - case MCObjectFileInfo::IsELF: + case Triple::ELF: PlatformParser.reset(createELFAsmParser()); break; + case Triple::UnknownObjectFormat: + break; } PlatformParser->Initialize(*this); diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index 9292f660735a..7d7a09f2694e 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -4055,10 +4055,10 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, /// ParseDirective parses the arm specific directives bool AArch64AsmParser::ParseDirective(AsmToken DirectiveID) { - const MCObjectFileInfo::Environment Format = - getContext().getObjectFileInfo()->getObjectFileType(); - bool IsMachO = Format == MCObjectFileInfo::IsMachO; - bool IsCOFF = Format == MCObjectFileInfo::IsCOFF; + Triple::ObjectFormatType Format = + getContext().getObjectFileInfo()->getTargetTriple().getObjectFormat(); + bool IsMachO = Format == Triple::MachO; + bool IsCOFF = Format == Triple::COFF; StringRef IDVal = DirectiveID.getIdentifier(); SMLoc Loc = DirectiveID.getLoc(); diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 2d291bf8652c..21414b085ffd 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -5173,18 +5173,11 @@ bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) { return true; } - enum { - COFF = (1 << MCObjectFileInfo::IsCOFF), - ELF = (1 << MCObjectFileInfo::IsELF), - MACHO = (1 << MCObjectFileInfo::IsMachO) - }; static const struct PrefixEntry { const char *Spelling; ARMMCExpr::VariantKind VariantKind; - uint8_t SupportedFormats; } PrefixEntries[] = { - { "lower16", ARMMCExpr::VK_ARM_LO16, COFF | ELF | MACHO }, - { "upper16", ARMMCExpr::VK_ARM_HI16, COFF | ELF | MACHO }, + {"lower16", ARMMCExpr::VK_ARM_LO16}, {"upper16", ARMMCExpr::VK_ARM_HI16}, }; StringRef IDVal = Parser.getTok().getIdentifier(); @@ -5199,25 +5192,6 @@ bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) { return true; } - uint8_t CurrentFormat; - switch (getContext().getObjectFileInfo()->getObjectFileType()) { - case MCObjectFileInfo::IsMachO: - CurrentFormat = MACHO; - break; - case MCObjectFileInfo::IsELF: - CurrentFormat = ELF; - break; - case MCObjectFileInfo::IsCOFF: - CurrentFormat = COFF; - break; - } - - if (~Prefix->SupportedFormats & CurrentFormat) { - Error(Parser.getTok().getLoc(), - "cannot represent relocation in the current file format"); - return true; - } - RefKind = Prefix->VariantKind; Parser.Lex(); @@ -8691,10 +8665,10 @@ bool ARMAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, /// parseDirective parses the arm specific directives bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) { - const MCObjectFileInfo::Environment Format = - getContext().getObjectFileInfo()->getObjectFileType(); - bool IsMachO = Format == MCObjectFileInfo::IsMachO; - bool IsCOFF = Format == MCObjectFileInfo::IsCOFF; + Triple::ObjectFormatType Format = + getContext().getObjectFileInfo()->getTargetTriple().getObjectFormat(); + bool IsMachO = Format == Triple::MachO; + bool IsCOFF = Format == Triple::COFF; StringRef IDVal = DirectiveID.getIdentifier(); if (IDVal == ".word") @@ -8859,8 +8833,9 @@ void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) { /// ::= .thumbfunc symbol_name bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) { MCAsmParser &Parser = getParser(); - const auto Format = getContext().getObjectFileInfo()->getObjectFileType(); - bool IsMachO = Format == MCObjectFileInfo::IsMachO; + Triple::ObjectFormatType Format = + getContext().getObjectFileInfo()->getTargetTriple().getObjectFormat(); + bool IsMachO = Format == Triple::MachO; // Darwin asm has (optionally) function name after .thumb_func direction // ELF doesn't diff --git a/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll b/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll index e18476cee53c..2b7f077a4b29 100644 --- a/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll +++ b/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -mtriple="x86_64-pc-linux-gnu" | FileCheck %s -; RUN: llc < %s -mtriple="x86_64-pc-win64-coff" | FileCheck %s +; RUN: llc < %s -mtriple="x86_64-pc-unknown-elf" | FileCheck %s ; This test is a sanity check to ensure statepoints are generating StackMap ; sections correctly. This is not intended to be a rigorous test of the diff --git a/llvm/test/MC/COFF/ARM/directive-type-diagnostics.s b/llvm/test/MC/COFF/ARM/directive-type-diagnostics.s deleted file mode 100644 index f8a52cd43e42..000000000000 --- a/llvm/test/MC/COFF/ARM/directive-type-diagnostics.s +++ /dev/null @@ -1,10 +0,0 @@ -// RUN: not llvm-mc -triple arm-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s -// RUN: not llvm-mc -triple armeb-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s -// RUN: not llvm-mc -triple thumb-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s -// RUN: not llvm-mc -triple thumbeb-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s - - .type symbol 32 -// CHECK: error: expected STT_, '#', '%' or "" -// CHECK: .type symbol 32 -// CHECK: ^ -