X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FMC%2FMCObjectFileInfo.cpp;h=0ccd7087badc18c1401b8b53122ecb3e258fc327;hb=795a06a0465c180d5881e82c04709918aace7278;hp=ade4b496ec7f69d6fbbb19f917c89b8b8c8eb1e3;hpb=b0a171f7a0c2516543e88d57dd3a3ae891b7f47d;p=oota-llvm.git diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index ade4b496ec7..0ccd7087bad 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -16,6 +16,7 @@ #include "llvm/MC/MCSectionCOFF.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSectionMachO.h" +#include "llvm/Support/COFF.h" using namespace llvm; static bool useCompactUnwind(const Triple &T) { @@ -767,19 +768,25 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, TT = TheTriple; - Triple::ObjectFormatType Format = TT.getObjectFormat(); - switch (Format) { - case Triple::MachO: + 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; initMachOMCObjectFileInfo(TT); - break; - case Triple::COFF: + } else if ((Arch == Triple::x86 || Arch == Triple::x86_64 || + Arch == Triple::arm || Arch == Triple::thumb) && + (TT.isOSWindows() && TT.getObjectFormat() == Triple::COFF)) { + Env = IsCOFF; initCOFFMCObjectFileInfo(TT); - break; - case Triple::ELF: + } else { + Env = IsELF; initELFMCObjectFileInfo(TT); - break; - case Triple::UnknownObjectFormat: - break; } } @@ -795,9 +802,7 @@ MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { } void MCObjectFileInfo::InitEHFrameSection() { - Triple::ObjectFormatType Format = TT.getObjectFormat(); - switch (Format) { - case Triple::MachO: + if (Env == IsMachO) EHFrameSection = Ctx->getMachOSection("__TEXT", "__eh_frame", MachO::S_COALESCED | @@ -805,20 +810,14 @@ void MCObjectFileInfo::InitEHFrameSection() { MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT, SectionKind::getReadOnly()); - break; - case Triple::ELF: + else if (Env == IsELF) EHFrameSection = Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags); - break; - case Triple::COFF: + else 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; - } }