Skip to content

Commit 59343a9

Browse files
committed
Fix a bugs with using some Mach-O command line flags like "-arch armv7m".
The Mach-O command line flag like "-arch armv7m" does not match the arch name part of its llvm Triple which is "thumbv7m-apple-darwin”. I think the best way to fix this is to have llvm::object::MachOObjectFile::getArchTriple() optionally return the name of the Mach-O arch flag that would be used with -arch that matches the CPUType and CPUSubType. Then change llvm::object::MachOUniversalBinary::ObjectForArch::getArchTypeName() to use that and change it to getArchFlagName() as the type name is really part of the Triple and the -arch flag name is a Mach-O thing for a specific Triple with a specific Mcpu value. rdar://29663637 llvm-svn: 290001
1 parent 46225b1 commit 59343a9

File tree

11 files changed

+111
-58
lines changed

11 files changed

+111
-58
lines changed

llvm/include/llvm/Object/MachO.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,8 @@ class MachOObjectFile : public ObjectFile {
413413

414414
static Triple::ArchType getArch(uint32_t CPUType);
415415
static Triple getArchTriple(uint32_t CPUType, uint32_t CPUSubType,
416-
const char **McpuDefault = nullptr);
416+
const char **McpuDefault = nullptr,
417+
const char **ArchFlag = nullptr);
417418
static bool isValidArch(StringRef ArchFlag);
418419
static Triple getHostArch();
419420

llvm/include/llvm/Object/MachOUniversal.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,24 @@ class MachOUniversalBinary : public Binary {
8989
else // Parent->getMagic() == MachO::FAT_MAGIC_64
9090
return Header64.reserved;
9191
}
92-
std::string getArchTypeName() const {
92+
std::string getArchFlagName() const {
93+
const char *McpuDefault, *ArchFlag;
9394
if (Parent->getMagic() == MachO::FAT_MAGIC) {
9495
Triple T =
95-
MachOObjectFile::getArchTriple(Header.cputype, Header.cpusubtype);
96-
return T.getArchName();
96+
MachOObjectFile::getArchTriple(Header.cputype, Header.cpusubtype,
97+
&McpuDefault, &ArchFlag);
9798
} else { // Parent->getMagic() == MachO::FAT_MAGIC_64
9899
Triple T =
99100
MachOObjectFile::getArchTriple(Header64.cputype,
100-
Header64.cpusubtype);
101-
return T.getArchName();
101+
Header64.cpusubtype,
102+
&McpuDefault, &ArchFlag);
103+
}
104+
if (ArchFlag) {
105+
std::string ArchFlagName(ArchFlag);
106+
return ArchFlagName;
107+
} else {
108+
std::string ArchFlagName("");
109+
return ArchFlagName;
102110
}
103111
}
104112

llvm/lib/Object/MachOObjectFile.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2318,75 +2318,110 @@ Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType) {
23182318
}
23192319

23202320
Triple MachOObjectFile::getArchTriple(uint32_t CPUType, uint32_t CPUSubType,
2321-
const char **McpuDefault) {
2321+
const char **McpuDefault,
2322+
const char **ArchFlag) {
23222323
if (McpuDefault)
23232324
*McpuDefault = nullptr;
2325+
if (ArchFlag)
2326+
*ArchFlag = nullptr;
23242327

23252328
switch (CPUType) {
23262329
case MachO::CPU_TYPE_I386:
23272330
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
23282331
case MachO::CPU_SUBTYPE_I386_ALL:
2332+
if (ArchFlag)
2333+
*ArchFlag = "i386";
23292334
return Triple("i386-apple-darwin");
23302335
default:
23312336
return Triple();
23322337
}
23332338
case MachO::CPU_TYPE_X86_64:
23342339
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
23352340
case MachO::CPU_SUBTYPE_X86_64_ALL:
2341+
if (ArchFlag)
2342+
*ArchFlag = "x86_64";
23362343
return Triple("x86_64-apple-darwin");
23372344
case MachO::CPU_SUBTYPE_X86_64_H:
2345+
if (ArchFlag)
2346+
*ArchFlag = "x86_64h";
23382347
return Triple("x86_64h-apple-darwin");
23392348
default:
23402349
return Triple();
23412350
}
23422351
case MachO::CPU_TYPE_ARM:
23432352
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
23442353
case MachO::CPU_SUBTYPE_ARM_V4T:
2354+
if (ArchFlag)
2355+
*ArchFlag = "armv4t";
23452356
return Triple("armv4t-apple-darwin");
23462357
case MachO::CPU_SUBTYPE_ARM_V5TEJ:
2358+
if (ArchFlag)
2359+
*ArchFlag = "armv5e";
23472360
return Triple("armv5e-apple-darwin");
23482361
case MachO::CPU_SUBTYPE_ARM_XSCALE:
2362+
if (ArchFlag)
2363+
*ArchFlag = "xscale";
23492364
return Triple("xscale-apple-darwin");
23502365
case MachO::CPU_SUBTYPE_ARM_V6:
2366+
if (ArchFlag)
2367+
*ArchFlag = "armv6";
23512368
return Triple("armv6-apple-darwin");
23522369
case MachO::CPU_SUBTYPE_ARM_V6M:
23532370
if (McpuDefault)
23542371
*McpuDefault = "cortex-m0";
2372+
if (ArchFlag)
2373+
*ArchFlag = "armv6m";
23552374
return Triple("armv6m-apple-darwin");
23562375
case MachO::CPU_SUBTYPE_ARM_V7:
2376+
if (ArchFlag)
2377+
*ArchFlag = "armv7";
23572378
return Triple("armv7-apple-darwin");
23582379
case MachO::CPU_SUBTYPE_ARM_V7EM:
23592380
if (McpuDefault)
23602381
*McpuDefault = "cortex-m4";
2382+
if (ArchFlag)
2383+
*ArchFlag = "armv7em";
23612384
return Triple("thumbv7em-apple-darwin");
23622385
case MachO::CPU_SUBTYPE_ARM_V7K:
2386+
if (ArchFlag)
2387+
*ArchFlag = "armv7k";
23632388
return Triple("armv7k-apple-darwin");
23642389
case MachO::CPU_SUBTYPE_ARM_V7M:
23652390
if (McpuDefault)
23662391
*McpuDefault = "cortex-m3";
2392+
if (ArchFlag)
2393+
*ArchFlag = "armv7m";
23672394
return Triple("thumbv7m-apple-darwin");
23682395
case MachO::CPU_SUBTYPE_ARM_V7S:
2396+
if (ArchFlag)
2397+
*ArchFlag = "armv7s";
23692398
return Triple("armv7s-apple-darwin");
23702399
default:
23712400
return Triple();
23722401
}
23732402
case MachO::CPU_TYPE_ARM64:
23742403
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
23752404
case MachO::CPU_SUBTYPE_ARM64_ALL:
2405+
if (ArchFlag)
2406+
*ArchFlag = "arm64";
23762407
return Triple("arm64-apple-darwin");
23772408
default:
23782409
return Triple();
23792410
}
23802411
case MachO::CPU_TYPE_POWERPC:
23812412
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
23822413
case MachO::CPU_SUBTYPE_POWERPC_ALL:
2414+
if (ArchFlag)
2415+
*ArchFlag = "ppc";
23832416
return Triple("ppc-apple-darwin");
23842417
default:
23852418
return Triple();
23862419
}
23872420
case MachO::CPU_TYPE_POWERPC64:
23882421
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
23892422
case MachO::CPU_SUBTYPE_POWERPC_ALL:
2423+
if (ArchFlag)
2424+
*ArchFlag = "ppc64";
23902425
return Triple("ppc64-apple-darwin");
23912426
default:
23922427
return Triple();

llvm/lib/Object/MachOUniversal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ MachOUniversalBinary::getObjectForArch(StringRef ArchName) const {
219219
object_error::arch_not_found);
220220

221221
for (auto &Obj : objects())
222-
if (Obj.getArchTypeName() == ArchName)
222+
if (Obj.getArchFlagName() == ArchName)
223223
return Obj.getAsObjectFile();
224224
return make_error<GenericBinaryError>("fat file does not "
225225
"contain " +
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@ RUN: llvm-objdump -macho -d -arch armv7m %p/Inputs/fat-armv7m.o | FileCheck %s
2+
@ CHECK: fat-armv7m.o:
3+
@ CHECK: (__TEXT,__text) section
4+
@ CHECK: foo:
5+
@ CHECK: 00 bf nop

llvm/test/tools/llvm-symbolizer/fat.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=x86_64 | FileCheck --check-prefix=X86_64 %s
22
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=x86_64h | FileCheck --check-prefix=X86_64H %s
33
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=armv7 | FileCheck --check-prefix=ARMV7 %s
4-
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=thumbv7em | FileCheck --check-prefix=ARMV7EM %s
5-
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=thumbv7m | FileCheck --check-prefix=ARMV7M %s
4+
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=armv7em | FileCheck --check-prefix=ARMV7EM %s
5+
RUN: echo 0 | llvm-symbolizer -obj=%p/Inputs/fat.o -default-arch=armv7m | FileCheck --check-prefix=ARMV7M %s
66

77
X86_64: x86_64_function
88
X86_64H: x86_64h_function

llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static void DumpInput(StringRef Filename) {
112112
auto MachOOrErr = ObjForArch.getAsObjectFile();
113113
error(Filename, errorToErrorCode(MachOOrErr.takeError()));
114114
DumpObjectFile(**MachOOrErr,
115-
Filename + " (" + ObjForArch.getArchTypeName() + ")");
115+
Filename + " (" + ObjForArch.getArchFlagName() + ")");
116116
}
117117
}
118118

llvm/tools/llvm-nm/llvm-nm.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,7 +1148,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
11481148
for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
11491149
E = UB->end_objects();
11501150
I != E; ++I) {
1151-
if (ArchFlags[i] == I->getArchTypeName()) {
1151+
if (ArchFlags[i] == I->getArchFlagName()) {
11521152
ArchFound = true;
11531153
Expected<std::unique_ptr<ObjectFile>> ObjOrErr =
11541154
I->getAsObjectFile();
@@ -1160,18 +1160,18 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
11601160
ObjectFile &Obj = *ObjOrErr.get();
11611161
if (ArchFlags.size() > 1) {
11621162
if (PrintFileName)
1163-
ArchitectureName = I->getArchTypeName();
1163+
ArchitectureName = I->getArchFlagName();
11641164
else
11651165
outs() << "\n" << Obj.getFileName() << " (for architecture "
1166-
<< I->getArchTypeName() << ")"
1166+
<< I->getArchFlagName() << ")"
11671167
<< ":\n";
11681168
}
11691169
dumpSymbolNamesFromObject(Obj, false, ArchiveName,
11701170
ArchitectureName);
11711171
} else if (auto E = isNotObjectErrorInvalidFileType(
11721172
ObjOrErr.takeError())) {
11731173
error(std::move(E), Filename, ArchFlags.size() > 1 ?
1174-
StringRef(I->getArchTypeName()) : StringRef());
1174+
StringRef(I->getArchFlagName()) : StringRef());
11751175
continue;
11761176
} else if (Expected<std::unique_ptr<Archive>> AOrErr =
11771177
I->getAsArchive()) {
@@ -1184,7 +1184,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
11841184
if (auto E = isNotObjectErrorInvalidFileType(
11851185
ChildOrErr.takeError())) {
11861186
error(std::move(E), Filename, C, ArchFlags.size() > 1 ?
1187-
StringRef(I->getArchTypeName()) : StringRef());
1187+
StringRef(I->getArchFlagName()) : StringRef());
11881188
}
11891189
continue;
11901190
}
@@ -1193,12 +1193,12 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
11931193
if (PrintFileName) {
11941194
ArchiveName = A->getFileName();
11951195
if (ArchFlags.size() > 1)
1196-
ArchitectureName = I->getArchTypeName();
1196+
ArchitectureName = I->getArchFlagName();
11971197
} else {
11981198
outs() << "\n" << A->getFileName();
11991199
outs() << "(" << O->getFileName() << ")";
12001200
if (ArchFlags.size() > 1) {
1201-
outs() << " (for architecture " << I->getArchTypeName()
1201+
outs() << " (for architecture " << I->getArchFlagName()
12021202
<< ")";
12031203
}
12041204
outs() << ":\n";
@@ -1212,7 +1212,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
12121212
} else {
12131213
consumeError(AOrErr.takeError());
12141214
error(Filename + " for architecture " +
1215-
StringRef(I->getArchTypeName()) +
1215+
StringRef(I->getArchFlagName()) +
12161216
" is not a Mach-O file or an archive file",
12171217
"Mach-O universal file");
12181218
}
@@ -1233,7 +1233,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
12331233
for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
12341234
E = UB->end_objects();
12351235
I != E; ++I) {
1236-
if (HostArchName == I->getArchTypeName()) {
1236+
if (HostArchName == I->getArchFlagName()) {
12371237
Expected<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
12381238
std::string ArchiveName;
12391239
ArchiveName.clear();
@@ -1273,7 +1273,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
12731273
} else {
12741274
consumeError(AOrErr.takeError());
12751275
error(Filename + " for architecture " +
1276-
StringRef(I->getArchTypeName()) +
1276+
StringRef(I->getArchFlagName()) +
12771277
" is not a Mach-O file or an archive file",
12781278
"Mach-O universal file");
12791279
}
@@ -1296,20 +1296,20 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
12961296
ObjectFile &Obj = *ObjOrErr.get();
12971297
if (PrintFileName) {
12981298
if (isa<MachOObjectFile>(Obj) && moreThanOneArch)
1299-
ArchitectureName = I->getArchTypeName();
1299+
ArchitectureName = I->getArchFlagName();
13001300
} else {
13011301
if (moreThanOneArch)
13021302
outs() << "\n";
13031303
outs() << Obj.getFileName();
13041304
if (isa<MachOObjectFile>(Obj) && moreThanOneArch)
1305-
outs() << " (for architecture " << I->getArchTypeName() << ")";
1305+
outs() << " (for architecture " << I->getArchFlagName() << ")";
13061306
outs() << ":\n";
13071307
}
13081308
dumpSymbolNamesFromObject(Obj, false, ArchiveName, ArchitectureName);
13091309
} else if (auto E = isNotObjectErrorInvalidFileType(
13101310
ObjOrErr.takeError())) {
13111311
error(std::move(E), Filename, moreThanOneArch ?
1312-
StringRef(I->getArchTypeName()) : StringRef());
1312+
StringRef(I->getArchFlagName()) : StringRef());
13131313
continue;
13141314
} else if (Expected<std::unique_ptr<Archive>> AOrErr =
13151315
I->getAsArchive()) {
@@ -1329,13 +1329,13 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
13291329
if (PrintFileName) {
13301330
ArchiveName = A->getFileName();
13311331
if (isa<MachOObjectFile>(O) && moreThanOneArch)
1332-
ArchitectureName = I->getArchTypeName();
1332+
ArchitectureName = I->getArchFlagName();
13331333
} else {
13341334
outs() << "\n" << A->getFileName();
13351335
if (isa<MachOObjectFile>(O)) {
13361336
outs() << "(" << O->getFileName() << ")";
13371337
if (moreThanOneArch)
1338-
outs() << " (for architecture " << I->getArchTypeName()
1338+
outs() << " (for architecture " << I->getArchFlagName()
13391339
<< ")";
13401340
} else
13411341
outs() << ":" << O->getFileName();
@@ -1349,7 +1349,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
13491349
} else {
13501350
consumeError(AOrErr.takeError());
13511351
error(Filename + " for architecture " +
1352-
StringRef(I->getArchTypeName()) +
1352+
StringRef(I->getArchFlagName()) +
13531353
" is not a Mach-O file or an archive file",
13541354
"Mach-O universal file");
13551355
}

0 commit comments

Comments
 (0)