summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Object/MachO.h10
-rw-r--r--include/llvm/Object/MachOUniversal.h3
-rw-r--r--lib/Object/MachOObjectFile.cpp64
-rw-r--r--test/tools/dsymutil/ARM/dummy-debug-map.map2
-rw-r--r--test/tools/dsymutil/arch-option.test4
-rw-r--r--test/tools/llvm-objdump/ARM/macho-v7m.test10
-rw-r--r--test/tools/llvm-symbolizer/fat.test4
-rw-r--r--tools/dsymutil/BinaryHolder.cpp11
-rw-r--r--tools/dsymutil/BinaryHolder.h2
-rw-r--r--tools/dsymutil/MachODebugMapParser.cpp12
-rw-r--r--tools/llvm-nm/llvm-nm.cpp4
-rw-r--r--tools/llvm-objdump/MachODump.cpp17
-rw-r--r--tools/llvm-size/llvm-size.cpp4
13 files changed, 47 insertions, 100 deletions
diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h
index ea4fc882480..852846890a1 100644
--- a/include/llvm/Object/MachO.h
+++ b/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/include/llvm/Object/MachOUniversal.h b/include/llvm/Object/MachOUniversal.h
index 232f6ed186c..f5bcaf6ccc6 100644
--- a/include/llvm/Object/MachOUniversal.h
+++ b/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/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 743166d4bf5..a182c4f5b9b 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/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/test/tools/dsymutil/ARM/dummy-debug-map.map b/test/tools/dsymutil/ARM/dummy-debug-map.map
index aa69aeafedb..a6fb47dd011 100644
--- a/test/tools/dsymutil/ARM/dummy-debug-map.map
+++ b/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/test/tools/dsymutil/arch-option.test b/test/tools/dsymutil/arch-option.test
index 0920efb529d..a028bd7e060 100644
--- a/test/tools/dsymutil/arch-option.test
+++ b/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/test/tools/llvm-objdump/ARM/macho-v7m.test b/test/tools/llvm-objdump/ARM/macho-v7m.test
new file mode 100644
index 00000000000..938aa4f7d60
--- /dev/null
+++ b/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/test/tools/llvm-symbolizer/fat.test b/test/tools/llvm-symbolizer/fat.test
index 1ecd1abb356..f943150441f 100644
--- a/test/tools/llvm-symbolizer/fat.test
+++ b/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/tools/dsymutil/BinaryHolder.cpp b/tools/dsymutil/BinaryHolder.cpp
index 1f789e1628d..7644f01952f 100644
--- a/tools/dsymutil/BinaryHolder.cpp
+++ b/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/tools/dsymutil/BinaryHolder.h b/tools/dsymutil/BinaryHolder.h
index 9d7b4bd8787..d56a39597c2 100644
--- a/tools/dsymutil/BinaryHolder.h
+++ b/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/tools/dsymutil/MachODebugMapParser.cpp b/tools/dsymutil/MachODebugMapParser.cpp
index 87577610752..0a8c4783930 100644
--- a/tools/dsymutil/MachODebugMapParser.cpp
+++ b/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/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp
index f86e758eb08..05ebc44ff83 100644
--- a/tools/llvm-nm/llvm-nm.cpp
+++ b/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/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp
index ecf6b359146..7f256cb58fe 100644
--- a/tools/llvm-objdump/MachODump.cpp
+++ b/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/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp
index 83e75d3039e..1be173bdf54 100644
--- a/tools/llvm-size/llvm-size.cpp
+++ b/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) {