summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Riss <friss@apple.com>2015-06-22 21:33:24 +0000
committerFrederic Riss <friss@apple.com>2015-06-22 21:33:24 +0000
commitebc162a766b7fe84b816d4faccadf59abe1ca4ef (patch)
tree4d1b6399be8a4f6497e6f1eae8fbf7cfae309a13
parent0b938284dac20587ad98536db03b95971bf24f33 (diff)
downloadbcm5719-llvm-ebc162a766b7fe84b816d4faccadf59abe1ca4ef.tar.gz
bcm5719-llvm-ebc162a766b7fe84b816d4faccadf59abe1ca4ef.zip
[Object] Search for architecures by name in MachOUniversalBinary::getObjectForArch()
The reason we need to search by name rather than by Triple::ArchType is to handle subarchitecture correclty. There is no different ArchType for the x86_64h architecture (it identifies itself as x86_64), or for the various ARM subarches. The only way to get to the subarch slice in an universal binary is to search by name. This issue led to hard to debug and transient symbolication failures in Asan tests (it mostly works, because the files are very similar). This also affects the Profiling infrastucture as it is the other user of that API. Reviewers: samsonov, bogner Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10604 llvm-svn: 240339
-rw-r--r--llvm/include/llvm/Object/MachOUniversal.h2
-rw-r--r--llvm/include/llvm/ProfileData/CoverageMapping.h2
-rw-r--r--llvm/include/llvm/ProfileData/CoverageMappingReader.h2
-rw-r--r--llvm/lib/Object/MachOUniversal.cpp20
-rw-r--r--llvm/lib/ProfileData/CoverageMapping.cpp2
-rw-r--r--llvm/lib/ProfileData/CoverageMappingReader.cpp6
-rw-r--r--llvm/test/tools/llvm-symbolizer/Inputs/fat.c15
-rw-r--r--llvm/test/tools/llvm-symbolizer/Inputs/fat.obin0 -> 49444 bytes
-rw-r--r--llvm/test/tools/llvm-symbolizer/fat.test11
-rw-r--r--llvm/tools/llvm-cov/CodeCoverage.cpp15
-rw-r--r--llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp2
11 files changed, 44 insertions, 33 deletions
diff --git a/llvm/include/llvm/Object/MachOUniversal.h b/llvm/include/llvm/Object/MachOUniversal.h
index ebc8b906691..3cdf9f0a4c0 100644
--- a/llvm/include/llvm/Object/MachOUniversal.h
+++ b/llvm/include/llvm/Object/MachOUniversal.h
@@ -109,7 +109,7 @@ public:
}
ErrorOr<std::unique_ptr<MachOObjectFile>>
- getObjectForArch(Triple::ArchType Arch) const;
+ getObjectForArch(StringRef ArchName) const;
};
} // namespace object
diff --git a/llvm/include/llvm/ProfileData/CoverageMapping.h b/llvm/include/llvm/ProfileData/CoverageMapping.h
index 94e655c3edc..3488e793d84 100644
--- a/llvm/include/llvm/ProfileData/CoverageMapping.h
+++ b/llvm/include/llvm/ProfileData/CoverageMapping.h
@@ -410,7 +410,7 @@ public:
/// \brief Load the coverage mapping from the given files.
static ErrorOr<std::unique_ptr<CoverageMapping>>
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.
///
diff --git a/llvm/include/llvm/ProfileData/CoverageMappingReader.h b/llvm/include/llvm/ProfileData/CoverageMappingReader.h
index 020edbd3e6c..38fb4680476 100644
--- a/llvm/include/llvm/ProfileData/CoverageMappingReader.h
+++ b/llvm/include/llvm/ProfileData/CoverageMappingReader.h
@@ -171,7 +171,7 @@ private:
public:
static ErrorOr<std::unique_ptr<BinaryCoverageReader>>
create(std::unique_ptr<MemoryBuffer> &ObjectBuffer,
- Triple::ArchType Arch = Triple::ArchType::UnknownArch);
+ StringRef Arch);
std::error_code readNextRecord(CoverageMappingRecord &Record) override;
};
diff --git a/llvm/lib/Object/MachOUniversal.cpp b/llvm/lib/Object/MachOUniversal.cpp
index 2705e7dc40e..1d0e69e4622 100644
--- a/llvm/lib/Object/MachOUniversal.cpp
+++ b/llvm/lib/Object/MachOUniversal.cpp
@@ -123,25 +123,13 @@ MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source,
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<std::unique_ptr<MachOObjectFile>>
-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<uint32_t>(CTM))
+ if (I->getArchTypeName() == ArchName)
return I->getAsObjectFile();
}
return object_error::arch_not_found;
diff --git a/llvm/lib/ProfileData/CoverageMapping.cpp b/llvm/lib/ProfileData/CoverageMapping.cpp
index b6c2489bd5c..a650f76f394 100644
--- a/llvm/lib/ProfileData/CoverageMapping.cpp
+++ b/llvm/lib/ProfileData/CoverageMapping.cpp
@@ -236,7 +236,7 @@ CoverageMapping::load(CoverageMappingReader &CoverageReader,
ErrorOr<std::unique_ptr<CoverageMapping>>
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;
diff --git a/llvm/lib/ProfileData/CoverageMappingReader.cpp b/llvm/lib/ProfileData/CoverageMappingReader.cpp
index 32de0babcb2..43d5ecffe30 100644
--- a/llvm/lib/ProfileData/CoverageMappingReader.cpp
+++ b/llvm/lib/ProfileData/CoverageMappingReader.cpp
@@ -448,7 +448,7 @@ static std::error_code loadBinaryFormat(MemoryBufferRef ObjectBuffer,
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 @@ static std::error_code loadBinaryFormat(MemoryBufferRef ObjectBuffer,
// For any other object file, upcast and take ownership.
OF.reset(cast<object::ObjectFile>(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 @@ static std::error_code loadBinaryFormat(MemoryBufferRef ObjectBuffer,
ErrorOr<std::unique_ptr<BinaryCoverageReader>>
BinaryCoverageReader::create(std::unique_ptr<MemoryBuffer> &ObjectBuffer,
- Triple::ArchType Arch) {
+ StringRef Arch) {
std::unique_ptr<BinaryCoverageReader> Reader(new BinaryCoverageReader());
SectionData Profile;
diff --git a/llvm/test/tools/llvm-symbolizer/Inputs/fat.c b/llvm/test/tools/llvm-symbolizer/Inputs/fat.c
new file mode 100644
index 00000000000..0331c09fe5f
--- /dev/null
+++ b/llvm/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
diff --git a/llvm/test/tools/llvm-symbolizer/Inputs/fat.o b/llvm/test/tools/llvm-symbolizer/Inputs/fat.o
new file mode 100644
index 00000000000..947cfc2d8cd
--- /dev/null
+++ b/llvm/test/tools/llvm-symbolizer/Inputs/fat.o
Binary files differ
diff --git a/llvm/test/tools/llvm-symbolizer/fat.test b/llvm/test/tools/llvm-symbolizer/fat.test
new file mode 100644
index 00000000000..1ecd1abb356
--- /dev/null
+++ b/llvm/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
diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp
index 4ff53301881..8dc4d665f23 100644
--- a/llvm/tools/llvm-cov/CodeCoverage.cpp
+++ b/llvm/tools/llvm-cov/CodeCoverage.cpp
@@ -89,7 +89,7 @@ public:
LoadedSourceFiles;
bool CompareFilenamesOnly;
StringMap<std::string> RemappedFilenames;
- llvm::Triple::ArchType CoverageArch;
+ std::string CoverageArch;
};
}
@@ -349,15 +349,12 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
Filters.push_back(std::unique_ptr<CoverageFilter>(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);
diff --git a/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp b/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp
index b8fa83839cf..448cfe99ddd 100644
--- a/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp
+++ b/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp
@@ -436,7 +436,7 @@ LLVMSymbolizer::getObjectFileFromBinary(Binary *Bin,
if (I != ObjectFileForArch.end())
return I->second;
ErrorOr<std::unique_ptr<ObjectFile>> ParsedObj =
- UB->getObjectForArch(Triple(ArchName).getArch());
+ UB->getObjectForArch(ArchName);
if (ParsedObj) {
Res = ParsedObj.get().get();
ParsedBinariesAndObjects.push_back(std::move(ParsedObj.get()));
OpenPOWER on IntegriCloud