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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267249 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tim Northover 2016-04-22 23:21:13 +00:00
parent 4bfa27af78
commit d52a244185
13 changed files with 47 additions and 100 deletions

View File

@ -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();

View File

@ -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();
}

View File

@ -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 {

View File

@ -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:

View File

@ -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: ---

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -128,8 +128,6 @@ public:
return Err;
return cast<ObjectFileType>(*ErrOrObj);
}
static Triple getTriple(const object::MachOObjectFile &Obj);
};
}
}

View File

@ -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);

View File

@ -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(),

View File

@ -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) {

View File

@ -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) {