summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArmando Montanez <amontanez@google.com>2019-01-07 17:33:10 +0000
committerArmando Montanez <amontanez@google.com>2019-01-07 17:33:10 +0000
commit488545ef1553526e0e5ebc416bbefab0b54f2f14 (patch)
treea1cf1f51603d681a6a8cf12154612e73e1f34640
parent1f66672515773d8086d0d167ad494c87c3f93da9 (diff)
downloadbcm5719-llvm-488545ef1553526e0e5ebc416bbefab0b54f2f14.tar.gz
bcm5719-llvm-488545ef1553526e0e5ebc416bbefab0b54f2f14.zip
[elfabi] Add option to manually specify file read format
Although llvm-elfabi will attempt to read input files without needing the format to be manually specified, doing so has the potential to introduce extraneous errors that can hinder debugging (since multiple readers may fail in attempts to read the file). This change allows the input file format to be manually specified to force elfabi to use a single reader. This makes it easier to test and debug errors specific to a given reader. llvm-svn: 350545
-rw-r--r--llvm/test/tools/llvm-elfabi/read-tbe-as-elf.test16
-rw-r--r--llvm/test/tools/llvm-elfabi/read-tbe-as-tbe.test13
-rw-r--r--llvm/tools/llvm-elfabi/llvm-elfabi.cpp43
3 files changed, 62 insertions, 10 deletions
diff --git a/llvm/test/tools/llvm-elfabi/read-tbe-as-elf.test b/llvm/test/tools/llvm-elfabi/read-tbe-as-elf.test
new file mode 100644
index 00000000000..eaddd38867a
--- /dev/null
+++ b/llvm/test/tools/llvm-elfabi/read-tbe-as-elf.test
@@ -0,0 +1,16 @@
+# RUN: not llvm-elfabi --elf %s --emit-tbe=%t 2>&1 | FileCheck %s
+
+--- !tapi-tbe
+SoName: somelib.so
+TbeVersion: 1.0
+Arch: x86_64
+Symbols:
+ foo: { Type: Func }
+ bar: { Type: Object, Size: 42 }
+ baz: { Type: Object, Size: 8 }
+ not: { Type: Object, Undefined: true, Size: 128 }
+ nor: { Type: Func, Undefined: true }
+...
+
+# CHECK: The file was not recognized as a valid object file
+# CHECK: No file readers succeeded reading `{{.*}}read-tbe-as-elf.test` (unsupported/malformed file?)
diff --git a/llvm/test/tools/llvm-elfabi/read-tbe-as-tbe.test b/llvm/test/tools/llvm-elfabi/read-tbe-as-tbe.test
new file mode 100644
index 00000000000..a5e2d44134e
--- /dev/null
+++ b/llvm/test/tools/llvm-elfabi/read-tbe-as-tbe.test
@@ -0,0 +1,13 @@
+# RUN: llvm-elfabi --tbe %s --emit-tbe=- | FileCheck %s
+
+--- !tapi-tbe
+TbeVersion: 1.0
+Arch: AArch64
+Symbols: {}
+...
+
+# CHECK: --- !tapi-tbe
+# CHECK-NEXT: TbeVersion: {{[1-9]\d*\.(0|([1-9]\d*))}}
+# CHECK-NEXT: Arch: AArch64
+# CHECK-NEXT: Symbols: {}
+# CHECK-NEXT: ...
diff --git a/llvm/tools/llvm-elfabi/llvm-elfabi.cpp b/llvm/tools/llvm-elfabi/llvm-elfabi.cpp
index e7c81604ee1..4c15bc2eaf3 100644
--- a/llvm/tools/llvm-elfabi/llvm-elfabi.cpp
+++ b/llvm/tools/llvm-elfabi/llvm-elfabi.cpp
@@ -19,10 +19,27 @@
#include "llvm/TextAPI/ELF/TBEHandler.h"
#include <string>
+namespace llvm {
+namespace elfabi {
+
+enum class FileFormat {
+ TBE,
+ ELF
+};
+
+} // end namespace elfabi
+} // end namespace llvm
+
using namespace llvm;
using namespace llvm::elfabi;
// Command line flags:
+cl::opt<FileFormat> InputFileFormat(
+ cl::desc("Force input file format:"),
+ cl::values(clEnumValN(FileFormat::TBE,
+ "tbe", "Read `input` as text-based ELF stub"),
+ clEnumValN(FileFormat::ELF,
+ "elf", "Read `input` as ELF binary")));
cl::opt<std::string> InputFilePath(cl::Positional, cl::desc("input"),
cl::Required);
cl::opt<std::string>
@@ -67,20 +84,26 @@ static Expected<std::unique_ptr<ELFStub>> readInputFile(StringRef FilePath) {
ErrorCollector EC(/*UseFatalErrors=*/false);
// First try to read as a binary (fails fast if not binary).
- Expected<std::unique_ptr<ELFStub>> StubFromELF =
- readELFFile(FileReadBuffer->getMemBufferRef());
- if (StubFromELF) {
- return std::move(*StubFromELF);
+ if (InputFileFormat.getNumOccurrences() == 0 ||
+ InputFileFormat == FileFormat::ELF) {
+ Expected<std::unique_ptr<ELFStub>> StubFromELF =
+ readELFFile(FileReadBuffer->getMemBufferRef());
+ if (StubFromELF) {
+ return std::move(*StubFromELF);
+ }
+ EC.addError(StubFromELF.takeError(), "BinaryRead");
}
- EC.addError(StubFromELF.takeError(), "BinaryRead");
// Fall back to reading as a tbe.
- Expected<std::unique_ptr<ELFStub>> StubFromTBE =
- readTBEFromBuffer(FileReadBuffer->getBuffer());
- if (StubFromTBE) {
- return std::move(*StubFromTBE);
+ if (InputFileFormat.getNumOccurrences() == 0 ||
+ InputFileFormat == FileFormat::TBE) {
+ Expected<std::unique_ptr<ELFStub>> StubFromTBE =
+ readTBEFromBuffer(FileReadBuffer->getBuffer());
+ if (StubFromTBE) {
+ return std::move(*StubFromTBE);
+ }
+ EC.addError(StubFromTBE.takeError(), "YamlParse");
}
- EC.addError(StubFromTBE.takeError(), "YamlParse");
// If both readers fail, build a new error that includes all information.
EC.addError(createStringError(errc::not_supported,
OpenPOWER on IntegriCloud