Index: llvm/trunk/include/llvm/Object/MachOUniversal.h =================================================================== --- llvm/trunk/include/llvm/Object/MachOUniversal.h +++ llvm/trunk/include/llvm/Object/MachOUniversal.h @@ -109,7 +109,7 @@ } ErrorOr> - getObjectForArch(Triple::ArchType Arch) const; + getObjectForArch(StringRef ArchName) const; }; } // namespace object Index: llvm/trunk/include/llvm/ProfileData/CoverageMapping.h =================================================================== --- llvm/trunk/include/llvm/ProfileData/CoverageMapping.h +++ llvm/trunk/include/llvm/ProfileData/CoverageMapping.h @@ -410,7 +410,7 @@ /// \brief Load the coverage mapping from the given files. static ErrorOr> load(StringRef ObjectFilename, StringRef ProfileFilename, - Triple::ArchType Arch = Triple::ArchType::UnknownArch); + StringRef Arch = StringRef()); /// \brief The number of functions that couldn't have their profiles mapped. /// Index: llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h =================================================================== --- llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h +++ llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h @@ -171,7 +171,7 @@ public: static ErrorOr> create(std::unique_ptr &ObjectBuffer, - Triple::ArchType Arch = Triple::ArchType::UnknownArch); + StringRef Arch); std::error_code readNextRecord(CoverageMappingRecord &Record) override; }; Index: llvm/trunk/lib/Object/MachOUniversal.cpp =================================================================== --- llvm/trunk/lib/Object/MachOUniversal.cpp +++ llvm/trunk/lib/Object/MachOUniversal.cpp @@ -123,25 +123,13 @@ ec = std::error_code(); } -static bool getCTMForArch(Triple::ArchType Arch, MachO::CPUType &CTM) { - switch (Arch) { - case Triple::x86: CTM = MachO::CPU_TYPE_I386; return true; - case Triple::x86_64: CTM = MachO::CPU_TYPE_X86_64; return true; - case Triple::arm: CTM = MachO::CPU_TYPE_ARM; return true; - case Triple::sparc: CTM = MachO::CPU_TYPE_SPARC; return true; - case Triple::ppc: CTM = MachO::CPU_TYPE_POWERPC; return true; - case Triple::ppc64: CTM = MachO::CPU_TYPE_POWERPC64; return true; - default: return false; - } -} - ErrorOr> -MachOUniversalBinary::getObjectForArch(Triple::ArchType Arch) const { - MachO::CPUType CTM; - if (!getCTMForArch(Arch, CTM)) +MachOUniversalBinary::getObjectForArch(StringRef ArchName) const { + if (Triple(ArchName).getArch() == Triple::ArchType::UnknownArch) return object_error::arch_not_found; + for (object_iterator I = begin_objects(), E = end_objects(); I != E; ++I) { - if (I->getCPUType() == static_cast(CTM)) + if (I->getArchTypeName() == ArchName) return I->getAsObjectFile(); } return object_error::arch_not_found; Index: llvm/trunk/lib/ProfileData/CoverageMapping.cpp =================================================================== --- llvm/trunk/lib/ProfileData/CoverageMapping.cpp +++ llvm/trunk/lib/ProfileData/CoverageMapping.cpp @@ -236,7 +236,7 @@ ErrorOr> CoverageMapping::load(StringRef ObjectFilename, StringRef ProfileFilename, - Triple::ArchType Arch) { + StringRef Arch) { auto CounterMappingBuff = MemoryBuffer::getFileOrSTDIN(ObjectFilename); if (std::error_code EC = CounterMappingBuff.getError()) return EC; Index: llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp =================================================================== --- llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp +++ llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp @@ -448,7 +448,7 @@ StringRef &CoverageMapping, uint8_t &BytesInAddress, support::endianness &Endian, - Triple::ArchType Arch) { + StringRef Arch) { auto BinOrErr = object::createBinary(ObjectBuffer); if (std::error_code EC = BinOrErr.getError()) return EC; @@ -465,7 +465,7 @@ // For any other object file, upcast and take ownership. OF.reset(cast(Bin.release())); // If we've asked for a particular arch, make sure they match. - if (Arch != Triple::ArchType::UnknownArch && OF->getArch() != Arch) + if (!Arch.empty() && OF->getArch() != Triple(Arch).getArch()) return object_error::arch_not_found; } else // We can only handle object files. @@ -495,7 +495,7 @@ ErrorOr> BinaryCoverageReader::create(std::unique_ptr &ObjectBuffer, - Triple::ArchType Arch) { + StringRef Arch) { std::unique_ptr Reader(new BinaryCoverageReader()); SectionData Profile; Index: llvm/trunk/test/tools/llvm-symbolizer/Inputs/fat.c =================================================================== --- llvm/trunk/test/tools/llvm-symbolizer/Inputs/fat.c +++ llvm/trunk/test/tools/llvm-symbolizer/Inputs/fat.c @@ -0,0 +1,15 @@ +/* Compile with: + clang -arch armv7 -arch armv7m -arch armv7em -arch x86_64 -arch x86_64h -c +*/ + +#ifdef __x86_64h__ +void x86_64h_function() {} +#elif defined(__x86_64__) +void x86_64_function() {} +#elif defined(__ARM_ARCH_7EM__) +void armv7em_function() {} +#elif defined(__ARM_ARCH_7M__) +void armv7m_function() {} +#elif defined(__ARM_ARCH_7A__) +void armv7_function() {} +#endif Index: llvm/trunk/test/tools/llvm-symbolizer/fat.test =================================================================== --- llvm/trunk/test/tools/llvm-symbolizer/fat.test +++ llvm/trunk/test/tools/llvm-symbolizer/fat.test @@ -0,0 +1,11 @@ +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 + +X86_64: x86_64_function +X86_64H: x86_64h_function +ARMV7: armv7_function +ARMV7EM: armv7em_function +ARMV7M: armv7m_function Index: llvm/trunk/tools/llvm-cov/CodeCoverage.cpp =================================================================== --- llvm/trunk/tools/llvm-cov/CodeCoverage.cpp +++ llvm/trunk/tools/llvm-cov/CodeCoverage.cpp @@ -89,7 +89,7 @@ LoadedSourceFiles; bool CompareFilenamesOnly; StringMap RemappedFilenames; - llvm::Triple::ArchType CoverageArch; + std::string CoverageArch; }; } @@ -349,15 +349,12 @@ Filters.push_back(std::unique_ptr(StatFilterer)); } - if (Arch.empty()) - CoverageArch = llvm::Triple::ArchType::UnknownArch; - else { - CoverageArch = Triple(Arch).getArch(); - if (CoverageArch == llvm::Triple::ArchType::UnknownArch) { - errs() << "error: Unknown architecture: " << Arch << "\n"; - return 1; - } + if (!Arch.empty() && + Triple(Arch).getArch() == llvm::Triple::ArchType::UnknownArch) { + errs() << "error: Unknown architecture: " << Arch << "\n"; + return 1; } + CoverageArch = Arch; for (const auto &File : InputSourceFiles) { SmallString<128> Path(File); Index: llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp =================================================================== --- llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp +++ llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -436,7 +436,7 @@ if (I != ObjectFileForArch.end()) return I->second; ErrorOr> ParsedObj = - UB->getObjectForArch(Triple(ArchName).getArch()); + UB->getObjectForArch(ArchName); if (ParsedObj) { Res = ParsedObj.get().get(); ParsedBinariesAndObjects.push_back(std::move(ParsedObj.get()));