diff options
author | Tim Northover <tnorthover@apple.com> | 2016-04-22 23:21:13 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-04-22 23:21:13 +0000 |
commit | 9e8eb418e583974c7d24ca3d81f567accd5adbfa (patch) | |
tree | 190ba0bd9001e19d01db501f813692edc77b2140 | |
parent | cae0855a62d2dc09fddc581f7a52d10c43b17571 (diff) | |
download | bcm5719-llvm-9e8eb418e583974c7d24ca3d81f567accd5adbfa.tar.gz bcm5719-llvm-9e8eb418e583974c7d24ca3d81f567accd5adbfa.zip |
MachO: remove weird ARM/Thumb interface from MachOObjectFile
Only one consumer (llvm-objdump) actually cared about the fact that there were
two triples. Others were actively working around the fact that the Triple
returned by getArch might have been invalid. As for llvm-objdump, it needs to
be acutely aware of both Triples anyway, so being generic in the exposed API is
no benefit.
Also rename the version of getArch returning a Triple. Users were having to
pass an unwanted nullptr to disambiguate the two, which was nasty.
The only functional change here is that armv7m and armv7em object files no
longer crash llvm-objdump.
llvm-svn: 267249
-rw-r--r-- | llvm/include/llvm/Object/MachO.h | 10 | ||||
-rw-r--r-- | llvm/include/llvm/Object/MachOUniversal.h | 3 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 64 | ||||
-rw-r--r-- | llvm/test/tools/dsymutil/ARM/dummy-debug-map.map | 2 | ||||
-rw-r--r-- | llvm/test/tools/dsymutil/arch-option.test | 4 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objdump/ARM/macho-v7m.test | 10 | ||||
-rw-r--r-- | llvm/test/tools/llvm-symbolizer/fat.test | 4 | ||||
-rw-r--r-- | llvm/tools/dsymutil/BinaryHolder.cpp | 11 | ||||
-rw-r--r-- | llvm/tools/dsymutil/BinaryHolder.h | 2 | ||||
-rw-r--r-- | llvm/tools/dsymutil/MachODebugMapParser.cpp | 12 | ||||
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 17 | ||||
-rw-r--r-- | llvm/tools/llvm-size/llvm-size.cpp | 4 |
13 files changed, 47 insertions, 100 deletions
diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index ea4fc882480..852846890a1 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -261,7 +261,7 @@ public: StringRef getFileFormatName() const override; unsigned getArch() const override; - Triple getArch(const char **McpuDefault, Triple *ThumbTriple) const; + Triple getArchTriple(const char **McpuDefault = nullptr) const; relocation_iterator section_rel_begin(unsigned Index) const; relocation_iterator section_rel_end(unsigned Index) const; @@ -407,12 +407,8 @@ public: StringRef &Suffix); static Triple::ArchType getArch(uint32_t CPUType); - static Triple getArch(uint32_t CPUType, uint32_t CPUSubType, - const char **McpuDefault = nullptr); - static Triple getThumbArch(uint32_t CPUType, uint32_t CPUSubType, - const char **McpuDefault = nullptr); - static Triple getArch(uint32_t CPUType, uint32_t CPUSubType, - const char **McpuDefault, Triple *ThumbTriple); + static Triple getArchTriple(uint32_t CPUType, uint32_t CPUSubType, + const char **McpuDefault = nullptr); static bool isValidArch(StringRef ArchFlag); static Triple getHostArch(); diff --git a/llvm/include/llvm/Object/MachOUniversal.h b/llvm/include/llvm/Object/MachOUniversal.h index 232f6ed186c..f5bcaf6ccc6 100644 --- a/llvm/include/llvm/Object/MachOUniversal.h +++ b/llvm/include/llvm/Object/MachOUniversal.h @@ -58,7 +58,8 @@ public: uint32_t getSize() const { return Header.size; } uint32_t getAlign() const { return Header.align; } std::string getArchTypeName() const { - Triple T = MachOObjectFile::getArch(Header.cputype, Header.cpusubtype); + Triple T = + MachOObjectFile::getArchTriple(Header.cputype, Header.cpusubtype); return T.getArchName(); } diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 743166d4bf5..a182c4f5b9b 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -1184,8 +1184,8 @@ Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType) { } } -Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType, - const char **McpuDefault) { +Triple MachOObjectFile::getArchTriple(uint32_t CPUType, uint32_t CPUSubType, + const char **McpuDefault) { if (McpuDefault) *McpuDefault = nullptr; @@ -1225,13 +1225,13 @@ Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType, case MachO::CPU_SUBTYPE_ARM_V7EM: if (McpuDefault) *McpuDefault = "cortex-m4"; - return Triple("armv7em-apple-darwin"); + return Triple("thumbv7em-apple-darwin"); case MachO::CPU_SUBTYPE_ARM_V7K: return Triple("armv7k-apple-darwin"); case MachO::CPU_SUBTYPE_ARM_V7M: if (McpuDefault) *McpuDefault = "cortex-m3"; - return Triple("armv7m-apple-darwin"); + return Triple("thumbv7m-apple-darwin"); case MachO::CPU_SUBTYPE_ARM_V7S: return Triple("armv7s-apple-darwin"); default: @@ -1263,56 +1263,6 @@ Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType, } } -Triple MachOObjectFile::getThumbArch(uint32_t CPUType, uint32_t CPUSubType, - const char **McpuDefault) { - if (McpuDefault) - *McpuDefault = nullptr; - - switch (CPUType) { - case MachO::CPU_TYPE_ARM: - switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) { - case MachO::CPU_SUBTYPE_ARM_V4T: - return Triple("thumbv4t-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V5TEJ: - return Triple("thumbv5e-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_XSCALE: - return Triple("xscale-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V6: - return Triple("thumbv6-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V6M: - if (McpuDefault) - *McpuDefault = "cortex-m0"; - return Triple("thumbv6m-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V7: - return Triple("thumbv7-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V7EM: - if (McpuDefault) - *McpuDefault = "cortex-m4"; - return Triple("thumbv7em-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V7K: - return Triple("thumbv7k-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V7M: - if (McpuDefault) - *McpuDefault = "cortex-m3"; - return Triple("thumbv7m-apple-darwin"); - case MachO::CPU_SUBTYPE_ARM_V7S: - return Triple("thumbv7s-apple-darwin"); - default: - return Triple(); - } - default: - return Triple(); - } -} - -Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType, - const char **McpuDefault, Triple *ThumbTriple) { - Triple T = MachOObjectFile::getArch(CPUType, CPUSubType, McpuDefault); - *ThumbTriple = MachOObjectFile::getThumbArch(CPUType, CPUSubType, - McpuDefault); - return T; -} - Triple MachOObjectFile::getHostArch() { return Triple(sys::getDefaultTargetTriple()); } @@ -1342,10 +1292,8 @@ unsigned MachOObjectFile::getArch() const { return getArch(getCPUType(this)); } -Triple MachOObjectFile::getArch(const char **McpuDefault, - Triple *ThumbTriple) const { - *ThumbTriple = getThumbArch(Header.cputype, Header.cpusubtype, McpuDefault); - return getArch(Header.cputype, Header.cpusubtype, McpuDefault); +Triple MachOObjectFile::getArchTriple(const char **McpuDefault) const { + return getArchTriple(Header.cputype, Header.cpusubtype, McpuDefault); } relocation_iterator MachOObjectFile::section_rel_begin(unsigned Index) const { diff --git a/llvm/test/tools/dsymutil/ARM/dummy-debug-map.map b/llvm/test/tools/dsymutil/ARM/dummy-debug-map.map index aa69aeafedb..a6fb47dd011 100644 --- a/llvm/test/tools/dsymutil/ARM/dummy-debug-map.map +++ b/llvm/test/tools/dsymutil/ARM/dummy-debug-map.map @@ -6,7 +6,7 @@ # you can extend this file with as much object files and symbols as needed. --- -triple: 'thumbv7-apple-darwin' +triple: 'armv7-apple-darwin' objects: - filename: 1.o symbols: diff --git a/llvm/test/tools/dsymutil/arch-option.test b/llvm/test/tools/dsymutil/arch-option.test index 0920efb529d..a028bd7e060 100644 --- a/llvm/test/tools/dsymutil/arch-option.test +++ b/llvm/test/tools/dsymutil/arch-option.test @@ -14,14 +14,14 @@ RUN: not llvm-dsymutil -oso-prepend-path %p -dump-debug-map %p/Inputs/fat-test.a ARMV7: --- ARMV7-NOT: ... -ARMV7: triple: 'thumbv7-apple-darwin' +ARMV7: triple: 'armv7-apple-darwin' ARMV7-NOT: ... ARMV7: sym: _armv7_var ARMV7-NOT: --- ARMV7S: --- ARMV7S-NOT: ... -ARMV7S: triple: 'thumbv7s-apple-darwin' +ARMV7S: triple: 'armv7s-apple-darwin' ARMV7S-NOT: ... ARMV7S: sym: _armv7s_var ARMV7S-NOT: --- diff --git a/llvm/test/tools/llvm-objdump/ARM/macho-v7m.test b/llvm/test/tools/llvm-objdump/ARM/macho-v7m.test new file mode 100644 index 00000000000..938aa4f7d60 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/ARM/macho-v7m.test @@ -0,0 +1,10 @@ +@ RUN: llvm-mc < %s -triple thumbv7m-apple-macho -filetype=obj | llvm-objdump -macho -d - | FileCheck %s +@ RUN: llvm-mc < %s -triple thumbv7em-apple-macho -filetype=obj | llvm-objdump -macho -d - | FileCheck %s + + .thumb + .thumb_func _t +_t: + @ A nice Cortex-M only instruction to make sure the default CPU is sound. + msr msp, r0 + +@ CHECK: msr msp, r0
\ No newline at end of file diff --git a/llvm/test/tools/llvm-symbolizer/fat.test b/llvm/test/tools/llvm-symbolizer/fat.test index 1ecd1abb356..f943150441f 100644 --- a/llvm/test/tools/llvm-symbolizer/fat.test +++ b/llvm/test/tools/llvm-symbolizer/fat.test @@ -1,8 +1,8 @@ RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=x86_64 | FileCheck --check-prefix=X86_64 %s RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=x86_64h | FileCheck --check-prefix=X86_64H %s RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=armv7 | FileCheck --check-prefix=ARMV7 %s -RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=armv7em | FileCheck --check-prefix=ARMV7EM %s -RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=armv7m | FileCheck --check-prefix=ARMV7M %s +RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=thumbv7em | FileCheck --check-prefix=ARMV7EM %s +RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=thumbv7m | FileCheck --check-prefix=ARMV7M %s X86_64: x86_64_function X86_64H: x86_64h_function diff --git a/llvm/tools/dsymutil/BinaryHolder.cpp b/llvm/tools/dsymutil/BinaryHolder.cpp index 1f789e1628d..7644f01952f 100644 --- a/llvm/tools/dsymutil/BinaryHolder.cpp +++ b/llvm/tools/dsymutil/BinaryHolder.cpp @@ -19,15 +19,6 @@ namespace llvm { namespace dsymutil { -Triple BinaryHolder::getTriple(const object::MachOObjectFile &Obj) { - // If a ThumbTriple is returned, use it instead of the standard - // one. This is because the thumb triple always allows to create a - // target, whereas the non-thumb one might not. - Triple ThumbTriple; - Triple T = Obj.getArch(nullptr, &ThumbTriple); - return ThumbTriple.getArch() ? ThumbTriple : T; -} - static std::vector<MemoryBufferRef> getMachOFatMemoryBuffers(StringRef Filename, MemoryBuffer &Mem, object::MachOUniversalBinary &Fat) { @@ -175,7 +166,7 @@ ErrorOr<const object::ObjectFile &> BinaryHolder::getObjfileForArch(const Triple &T) { for (const auto &Obj : CurrentObjectFiles) { if (const auto *MachO = dyn_cast<object::MachOObjectFile>(Obj.get())) { - if (getTriple(*MachO).str() == T.str()) + if (MachO->getArchTriple().str() == T.str()) return *MachO; } else if (Obj->getArch() == T.getArch()) return *Obj; diff --git a/llvm/tools/dsymutil/BinaryHolder.h b/llvm/tools/dsymutil/BinaryHolder.h index 9d7b4bd8787..d56a39597c2 100644 --- a/llvm/tools/dsymutil/BinaryHolder.h +++ b/llvm/tools/dsymutil/BinaryHolder.h @@ -128,8 +128,6 @@ public: return Err; return cast<ObjectFileType>(*ErrOrObj); } - - static Triple getTriple(const object::MachOObjectFile &Obj); }; } } diff --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp index 87577610752..0a8c4783930 100644 --- a/llvm/tools/dsymutil/MachODebugMapParser.cpp +++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp @@ -137,8 +137,7 @@ void MachODebugMapParser::switchToNewDebugMapObject(StringRef Filename, } static std::string getArchName(const object::MachOObjectFile &Obj) { - Triple ThumbTriple; - Triple T = Obj.getArch(nullptr, &ThumbTriple); + Triple T = Obj.getArchTriple(); return T.getArchName(); } @@ -146,8 +145,7 @@ std::unique_ptr<DebugMap> MachODebugMapParser::parseOneBinary(const MachOObjectFile &MainBinary, StringRef BinaryPath) { loadMainBinarySymbols(MainBinary); - Result = - make_unique<DebugMap>(BinaryHolder::getTriple(MainBinary), BinaryPath); + Result = make_unique<DebugMap>(MainBinary.getArchTriple(), BinaryPath); MainBinaryStrings = MainBinary.getStringTableData(); for (const SymbolRef &Symbol : MainBinary.symbols()) { const DataRefImpl &DRI = Symbol.getRawDataRefImpl(); @@ -308,9 +306,8 @@ bool MachODebugMapParser::dumpStab() { return false; } - Triple T; for (const auto *Binary : *MainBinOrError) - if (shouldLinkArch(Archs, Binary->getArch(nullptr, &T).getArchName())) + if (shouldLinkArch(Archs, Binary->getArchTriple().getArchName())) dumpOneBinaryStab(*Binary, BinaryPath); return true; @@ -326,9 +323,8 @@ ErrorOr<std::vector<std::unique_ptr<DebugMap>>> MachODebugMapParser::parse() { return Error; std::vector<std::unique_ptr<DebugMap>> Results; - Triple T; for (const auto *Binary : *MainBinOrError) - if (shouldLinkArch(Archs, Binary->getArch(nullptr, &T).getArchName())) + if (shouldLinkArch(Archs, Binary->getArchTriple().getArchName())) Results.push_back(parseOneBinary(*Binary, BinaryPath)); return std::move(Results); diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index f86e758eb08..05ebc44ff83 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -1005,10 +1005,10 @@ static bool checkMachOAndArchFlags(SymbolicFile *O, std::string &Filename) { Triple T; if (MachO->is64Bit()) { H_64 = MachO->MachOObjectFile::getHeader64(); - T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype); + T = MachOObjectFile::getArchTriple(H_64.cputype, H_64.cpusubtype); } else { H = MachO->MachOObjectFile::getHeader(); - T = MachOObjectFile::getArch(H.cputype, H.cpusubtype); + T = MachOObjectFile::getArchTriple(H.cputype, H.cpusubtype); } if (std::none_of( ArchFlags.begin(), ArchFlags.end(), diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index ecf6b359146..7f256cb58fe 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -142,11 +142,18 @@ static const Target *GetTarget(const MachOObjectFile *MachOObj, const char **McpuDefault, const Target **ThumbTarget) { // Figure out the target triple. + llvm::Triple TT(TripleName); if (TripleName.empty()) { - llvm::Triple TT("unknown-unknown-unknown"); - llvm::Triple ThumbTriple = Triple(); - TT = MachOObj->getArch(McpuDefault, &ThumbTriple); + TT = MachOObj->getArchTriple(McpuDefault); TripleName = TT.str(); + } + + if (TT.getArch() == Triple::arm) { + // We've inferred a 32-bit ARM target from the object file. All MachO CPUs + // that support ARM are also capable of Thumb mode. + llvm::Triple ThumbTriple = TT; + std::string ThumbName = (Twine("thumb") + TT.getArchName().substr(3)).str(); + ThumbTriple.setArchName(ThumbName); ThumbTripleName = ThumbTriple.str(); } @@ -1157,10 +1164,10 @@ static bool checkMachOAndArchFlags(ObjectFile *O, StringRef Filename) { Triple T; if (MachO->is64Bit()) { H_64 = MachO->MachOObjectFile::getHeader64(); - T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype); + T = MachOObjectFile::getArchTriple(H_64.cputype, H_64.cpusubtype); } else { H = MachO->MachOObjectFile::getHeader(); - T = MachOObjectFile::getArch(H.cputype, H.cpusubtype); + T = MachOObjectFile::getArchTriple(H.cputype, H.cpusubtype); } unsigned i; for (i = 0; i < ArchFlags.size(); ++i) { diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp index 83e75d3039e..1be173bdf54 100644 --- a/llvm/tools/llvm-size/llvm-size.cpp +++ b/llvm/tools/llvm-size/llvm-size.cpp @@ -438,10 +438,10 @@ static bool checkMachOAndArchFlags(ObjectFile *o, StringRef file) { Triple T; if (MachO->is64Bit()) { H_64 = MachO->MachOObjectFile::getHeader64(); - T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype); + T = MachOObjectFile::getArchTriple(H_64.cputype, H_64.cpusubtype); } else { H = MachO->MachOObjectFile::getHeader(); - T = MachOObjectFile::getArch(H.cputype, H.cpusubtype); + T = MachOObjectFile::getArchTriple(H.cputype, H.cpusubtype); } unsigned i; for (i = 0; i < ArchFlags.size(); ++i) { |