diff options
| -rw-r--r-- | llvm/test/tools/llvm-elfabi/read-tbe-as-elf.test | 16 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-elfabi/read-tbe-as-tbe.test | 13 | ||||
| -rw-r--r-- | llvm/tools/llvm-elfabi/llvm-elfabi.cpp | 43 |
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, |

