diff options
author | Haowei Wu <haowei@google.com> | 2021-03-31 16:48:56 -0700 |
---|---|---|
committer | Haowei Wu <haowei@google.com> | 2021-07-19 11:22:43 -0700 |
commit | 8b4acb067fd38ac33a63669ef46966dfee59257e (patch) | |
tree | ed1872874f34be4bac45fc55a4cc75ce53f86fbb /llvm/lib/InterfaceStub/ELFObjHandler.cpp | |
parent | 6c0e6895d014096ad7375e95997575ad1e8da020 (diff) | |
download | llvm-8b4acb067fd38ac33a63669ef46966dfee59257e.zip llvm-8b4acb067fd38ac33a63669ef46966dfee59257e.tar.gz llvm-8b4acb067fd38ac33a63669ef46966dfee59257e.tar.bz2 |
[elfabi] Prepare elfabi/ifs merging.
This change implements unified text stub format and command line
interface proposed in the elfabi/ifs merge plan.
Differential Revision: https://reviews.llvm.org/D99399
Diffstat (limited to 'llvm/lib/InterfaceStub/ELFObjHandler.cpp')
-rw-r--r-- | llvm/lib/InterfaceStub/ELFObjHandler.cpp | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/llvm/lib/InterfaceStub/ELFObjHandler.cpp b/llvm/lib/InterfaceStub/ELFObjHandler.cpp index 9deb5ba..6ed52be 100644 --- a/llvm/lib/InterfaceStub/ELFObjHandler.cpp +++ b/llvm/lib/InterfaceStub/ELFObjHandler.cpp @@ -250,7 +250,8 @@ public: fillStrTabShdr(ShStrTab); // Finish initializing the ELF header. - initELFHeader<ELFT>(ElfHeader, Stub.Arch); + initELFHeader<ELFT>(ElfHeader, + static_cast<uint16_t>(Stub.Target.Arch.getValue())); ElfHeader.e_shstrndx = ShStrTab.Index; ElfHeader.e_shnum = LastSection->Index + 1; ElfHeader.e_shoff = @@ -517,7 +518,7 @@ static Error populateSymbols(ELFStub &TargetStub, if (!SymName) return SymName.takeError(); ELFSymbol Sym = createELFSym<ELFT>(*SymName, RawSym); - TargetStub.Symbols.insert(std::move(Sym)); + TargetStub.Symbols.push_back(std::move(Sym)); // TODO: Populate symbol warning. } return Error::success(); @@ -561,7 +562,12 @@ buildStub(const ELFObjectFile<ELFT> &ElfObj) { DynEnt.StrSize); // Populate Arch from ELF header. - DestStub->Arch = ElfFile.getHeader().e_machine; + DestStub->Target.Arch = static_cast<ELFArch>(ElfFile.getHeader().e_machine); + DestStub->Target.BitWidth = + (ELFBitWidthType)ElfFile.getHeader().e_ident[EI_CLASS]; + DestStub->Target.Endianness = + (ELFEndiannessType)ElfFile.getHeader().e_ident[EI_DATA]; + DestStub->Target.ObjectFormat = "ELF"; // Populate SoName from .dynamic entries and dynamic string table. if (DynEnt.SONameOffset.hasValue()) { @@ -667,15 +673,23 @@ Expected<std::unique_ptr<ELFStub>> readELFFile(MemoryBufferRef Buf) { // This function wraps the ELFT writeELFBinaryToFile() so writeBinaryStub() // can be called without having to use ELFType templates directly. Error writeBinaryStub(StringRef FilePath, const ELFStub &Stub, - ELFTarget OutputFormat, bool WriteIfChanged) { - if (OutputFormat == ELFTarget::ELF32LE) - return writeELFBinaryToFile<ELF32LE>(FilePath, Stub, WriteIfChanged); - if (OutputFormat == ELFTarget::ELF32BE) - return writeELFBinaryToFile<ELF32BE>(FilePath, Stub, WriteIfChanged); - if (OutputFormat == ELFTarget::ELF64LE) - return writeELFBinaryToFile<ELF64LE>(FilePath, Stub, WriteIfChanged); - if (OutputFormat == ELFTarget::ELF64BE) - return writeELFBinaryToFile<ELF64BE>(FilePath, Stub, WriteIfChanged); + bool WriteIfChanged) { + assert(Stub.Target.Arch); + assert(Stub.Target.BitWidth); + assert(Stub.Target.Endianness); + if (Stub.Target.BitWidth == ELFBitWidthType::ELF32) { + if (Stub.Target.Endianness == ELFEndiannessType::Little) { + return writeELFBinaryToFile<ELF32LE>(FilePath, Stub, WriteIfChanged); + } else { + return writeELFBinaryToFile<ELF32BE>(FilePath, Stub, WriteIfChanged); + } + } else { + if (Stub.Target.Endianness == ELFEndiannessType::Little) { + return writeELFBinaryToFile<ELF64LE>(FilePath, Stub, WriteIfChanged); + } else { + return writeELFBinaryToFile<ELF64BE>(FilePath, Stub, WriteIfChanged); + } + } llvm_unreachable("invalid binary output target"); } |