mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-02 02:22:31 +00:00
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:
parent
4bfa27af78
commit
d52a244185
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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:
|
||||
|
@ -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: ---
|
||||
|
10
test/tools/llvm-objdump/ARM/macho-v7m.test
Normal file
10
test/tools/llvm-objdump/ARM/macho-v7m.test
Normal 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
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -128,8 +128,6 @@ public:
|
||||
return Err;
|
||||
return cast<ObjectFileType>(*ErrOrObj);
|
||||
}
|
||||
|
||||
static Triple getTriple(const object::MachOObjectFile &Obj);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user