aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Object
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object')
-rw-r--r--contrib/llvm-project/llvm/lib/Object/Archive.cpp6
-rw-r--r--contrib/llvm-project/llvm/lib/Object/ArchiveWriter.cpp35
-rw-r--r--contrib/llvm-project/llvm/lib/Object/Binary.cpp3
-rw-r--r--contrib/llvm-project/llvm/lib/Object/COFFObjectFile.cpp198
-rw-r--r--contrib/llvm-project/llvm/lib/Object/Decompressor.cpp15
-rw-r--r--contrib/llvm-project/llvm/lib/Object/ELF.cpp4
-rw-r--r--contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp38
-rw-r--r--contrib/llvm-project/llvm/lib/Object/MachOObjectFile.cpp56
-rw-r--r--contrib/llvm-project/llvm/lib/Object/MachOUniversal.cpp38
-rw-r--r--contrib/llvm-project/llvm/lib/Object/Minidump.cpp46
-rw-r--r--contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp4
-rw-r--r--contrib/llvm-project/llvm/lib/Object/Object.cpp10
-rw-r--r--contrib/llvm-project/llvm/lib/Object/ObjectFile.cpp18
-rw-r--r--contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp64
-rw-r--r--contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp1
-rw-r--r--contrib/llvm-project/llvm/lib/Object/TapiFile.cpp104
-rw-r--r--contrib/llvm-project/llvm/lib/Object/TapiUniversal.cpp54
-rw-r--r--contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp30
-rw-r--r--contrib/llvm-project/llvm/lib/Object/WindowsResource.cpp346
-rw-r--r--contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp282
20 files changed, 238 insertions, 1114 deletions
diff --git a/contrib/llvm-project/llvm/lib/Object/Archive.cpp b/contrib/llvm-project/llvm/lib/Object/Archive.cpp
index 148c011d9cd4..49e66f46ab3f 100644
--- a/contrib/llvm-project/llvm/lib/Object/Archive.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/Archive.cpp
@@ -223,8 +223,8 @@ Expected<StringRef> ArchiveMemberHeader::getName(uint64_t Size) const {
return Name.drop_back(1);
}
-Expected<uint64_t> ArchiveMemberHeader::getSize() const {
- uint64_t Ret;
+Expected<uint32_t> ArchiveMemberHeader::getSize() const {
+ uint32_t Ret;
if (StringRef(ArMemHdr->Size,
sizeof(ArMemHdr->Size)).rtrim(" ").getAsInteger(10, Ret)) {
std::string Buf;
@@ -550,7 +550,7 @@ Archive::Archive(MemoryBufferRef Source, Error &Err)
} else if (Buffer.startswith(Magic)) {
IsThin = false;
} else {
- Err = make_error<GenericBinaryError>("file too small to be an archive",
+ Err = make_error<GenericBinaryError>("File too small to be an archive",
object_error::invalid_file_type);
return;
}
diff --git a/contrib/llvm-project/llvm/lib/Object/ArchiveWriter.cpp b/contrib/llvm-project/llvm/lib/Object/ArchiveWriter.cpp
index 5234b0e18233..228f6b40c5ec 100644
--- a/contrib/llvm-project/llvm/lib/Object/ArchiveWriter.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/ArchiveWriter.cpp
@@ -16,10 +16,8 @@
#include "llvm/BinaryFormat/Magic.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Object/Archive.h"
-#include "llvm/Object/Error.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Object/SymbolicFile.h"
-#include "llvm/Support/Alignment.h"
#include "llvm/Support/EndianStream.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/ErrorHandling.h"
@@ -149,7 +147,7 @@ static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val) {
static void printRestOfMemberHeader(
raw_ostream &Out, const sys::TimePoint<std::chrono::seconds> &ModTime,
- unsigned UID, unsigned GID, unsigned Perms, uint64_t Size) {
+ unsigned UID, unsigned GID, unsigned Perms, unsigned Size) {
printWithSpacePadding(Out, sys::toTimeT(ModTime), 12);
// The format has only 6 chars for uid and gid. Truncate if the provided
@@ -166,7 +164,7 @@ static void
printGNUSmallMemberHeader(raw_ostream &Out, StringRef Name,
const sys::TimePoint<std::chrono::seconds> &ModTime,
unsigned UID, unsigned GID, unsigned Perms,
- uint64_t Size) {
+ unsigned Size) {
printWithSpacePadding(Out, Twine(Name) + "/", 16);
printRestOfMemberHeader(Out, ModTime, UID, GID, Perms, Size);
}
@@ -174,10 +172,11 @@ printGNUSmallMemberHeader(raw_ostream &Out, StringRef Name,
static void
printBSDMemberHeader(raw_ostream &Out, uint64_t Pos, StringRef Name,
const sys::TimePoint<std::chrono::seconds> &ModTime,
- unsigned UID, unsigned GID, unsigned Perms, uint64_t Size) {
+ unsigned UID, unsigned GID, unsigned Perms,
+ unsigned Size) {
uint64_t PosAfterHeader = Pos + 60 + Name.size();
// Pad so that even 64 bit object files are aligned.
- unsigned Pad = offsetToAlignment(PosAfterHeader, Align(8));
+ unsigned Pad = OffsetToAlignment(PosAfterHeader, 8);
unsigned NameWithPadding = Name.size() + Pad;
printWithSpacePadding(Out, Twine("#1/") + Twine(NameWithPadding), 16);
printRestOfMemberHeader(Out, ModTime, UID, GID, Perms,
@@ -209,7 +208,7 @@ static void
printMemberHeader(raw_ostream &Out, uint64_t Pos, raw_ostream &StringTable,
StringMap<uint64_t> &MemberNames, object::Archive::Kind Kind,
bool Thin, const NewArchiveMember &M,
- sys::TimePoint<std::chrono::seconds> ModTime, uint64_t Size) {
+ sys::TimePoint<std::chrono::seconds> ModTime, unsigned Size) {
if (isBSDLike(Kind))
return printBSDMemberHeader(Out, Pos, M.MemberName, ModTime, M.UID, M.GID,
M.Perms, Size);
@@ -244,7 +243,7 @@ struct MemberData {
static MemberData computeStringTable(StringRef Names) {
unsigned Size = Names.size();
- unsigned Pad = offsetToAlignment(Size, Align(2));
+ unsigned Pad = OffsetToAlignment(Size, 2);
std::string Header;
raw_string_ostream Out(Header);
printWithSpacePadding(Out, "//", 48);
@@ -308,8 +307,8 @@ static void writeSymbolTable(raw_ostream &Out, object::Archive::Kind Kind,
// least 4-byte aligned for 32-bit content. Opt for the larger encoding
// uniformly.
// We do this for all bsd formats because it simplifies aligning members.
- const Align Alignment(isBSDLike(Kind) ? 8 : 2);
- unsigned Pad = offsetToAlignment(Size, Alignment);
+ unsigned Alignment = isBSDLike(Kind) ? 8 : 2;
+ unsigned Pad = OffsetToAlignment(Size, Alignment);
Size += Pad;
if (isBSDLike(Kind)) {
@@ -465,9 +464,8 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames,
// uniformly. This matches the behaviour with cctools and ensures that ld64
// is happy with archives that we generate.
unsigned MemberPadding =
- isDarwin(Kind) ? offsetToAlignment(Data.size(), Align(8)) : 0;
- unsigned TailPadding =
- offsetToAlignment(Data.size() + MemberPadding, Align(2));
+ isDarwin(Kind) ? OffsetToAlignment(Data.size(), 8) : 0;
+ unsigned TailPadding = OffsetToAlignment(Data.size() + MemberPadding, 2);
StringRef Padding = StringRef(PaddingData, MemberPadding + TailPadding);
sys::TimePoint<std::chrono::seconds> ModTime;
@@ -476,17 +474,8 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames,
ModTime = sys::toTimePoint(FilenameCount[M.MemberName]++);
else
ModTime = M.ModTime;
-
- uint64_t Size = Buf.getBufferSize() + MemberPadding;
- if (Size > object::Archive::MaxMemberSize) {
- std::string StringMsg =
- "File " + M.MemberName.str() + " exceeds size limit";
- return make_error<object::GenericBinaryError>(
- std::move(StringMsg), object::object_error::parse_failed);
- }
-
printMemberHeader(Out, Pos, StringTable, MemberNames, Kind, Thin, M,
- ModTime, Size);
+ ModTime, Buf.getBufferSize() + MemberPadding);
Out.flush();
Expected<std::vector<unsigned>> Symbols =
diff --git a/contrib/llvm-project/llvm/lib/Object/Binary.cpp b/contrib/llvm-project/llvm/lib/Object/Binary.cpp
index 944d2bc1bca7..a953c1d8cb80 100644
--- a/contrib/llvm-project/llvm/lib/Object/Binary.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/Binary.cpp
@@ -18,7 +18,6 @@
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/Minidump.h"
#include "llvm/Object/ObjectFile.h"
-#include "llvm/Object/TapiUniversal.h"
#include "llvm/Object/WindowsResource.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
@@ -87,8 +86,6 @@ Expected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer,
return errorCodeToError(object_error::invalid_file_type);
case file_magic::minidump:
return MinidumpFile::create(Buffer);
- case file_magic::tapi_file:
- return TapiUniversal::create(Buffer);
}
llvm_unreachable("Unexpected Binary File Type");
}
diff --git a/contrib/llvm-project/llvm/lib/Object/COFFObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/COFFObjectFile.cpp
index 2c0f6dc2b1e9..854664e679df 100644
--- a/contrib/llvm-project/llvm/lib/Object/COFFObjectFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/COFFObjectFile.cpp
@@ -937,6 +937,29 @@ iterator_range<base_reloc_iterator> COFFObjectFile::base_relocs() const {
}
std::error_code
+COFFObjectFile::getCOFFHeader(const coff_file_header *&Res) const {
+ Res = COFFHeader;
+ return std::error_code();
+}
+
+std::error_code
+COFFObjectFile::getCOFFBigObjHeader(const coff_bigobj_file_header *&Res) const {
+ Res = COFFBigObjHeader;
+ return std::error_code();
+}
+
+std::error_code COFFObjectFile::getPE32Header(const pe32_header *&Res) const {
+ Res = PE32Header;
+ return std::error_code();
+}
+
+std::error_code
+COFFObjectFile::getPE32PlusHeader(const pe32plus_header *&Res) const {
+ Res = PE32PlusHeader;
+ return std::error_code();
+}
+
+std::error_code
COFFObjectFile::getDataDirectory(uint32_t Index,
const data_directory *&Res) const {
// Error if there's no data directory or the index is out of range.
@@ -971,12 +994,11 @@ std::error_code COFFObjectFile::getSection(int32_t Index,
std::error_code COFFObjectFile::getSection(StringRef SectionName,
const coff_section *&Result) const {
Result = nullptr;
+ StringRef SecName;
for (const SectionRef &Section : sections()) {
- auto NameOrErr = Section.getName();
- if (!NameOrErr)
- return errorToErrorCode(NameOrErr.takeError());
-
- if (*NameOrErr == SectionName) {
+ if (std::error_code E = Section.getName(SecName))
+ return E;
+ if (SecName == SectionName) {
Result = getCOFFSection(Section);
return std::error_code();
}
@@ -1662,12 +1684,9 @@ std::error_code BaseRelocRef::getRVA(uint32_t &Result) const {
return std::error_code();
}
-#define RETURN_IF_ERROR(Expr) \
- do { \
- Error E = (Expr); \
- if (E) \
- return std::move(E); \
- } while (0)
+#define RETURN_IF_ERROR(E) \
+ if (E) \
+ return E;
Expected<ArrayRef<UTF16>>
ResourceSectionRef::getDirStringAtOffset(uint32_t Offset) {
@@ -1696,168 +1715,11 @@ ResourceSectionRef::getTableAtOffset(uint32_t Offset) {
return *Table;
}
-Expected<const coff_resource_dir_entry &>
-ResourceSectionRef::getTableEntryAtOffset(uint32_t Offset) {
- const coff_resource_dir_entry *Entry = nullptr;
-
- BinaryStreamReader Reader(BBS);
- Reader.setOffset(Offset);
- RETURN_IF_ERROR(Reader.readObject(Entry));
- assert(Entry != nullptr);
- return *Entry;
-}
-
-Expected<const coff_resource_data_entry &>
-ResourceSectionRef::getDataEntryAtOffset(uint32_t Offset) {
- const coff_resource_data_entry *Entry = nullptr;
-
- BinaryStreamReader Reader(BBS);
- Reader.setOffset(Offset);
- RETURN_IF_ERROR(Reader.readObject(Entry));
- assert(Entry != nullptr);
- return *Entry;
-}
-
Expected<const coff_resource_dir_table &>
ResourceSectionRef::getEntrySubDir(const coff_resource_dir_entry &Entry) {
- assert(Entry.Offset.isSubDir());
return getTableAtOffset(Entry.Offset.value());
}
-Expected<const coff_resource_data_entry &>
-ResourceSectionRef::getEntryData(const coff_resource_dir_entry &Entry) {
- assert(!Entry.Offset.isSubDir());
- return getDataEntryAtOffset(Entry.Offset.value());
-}
-
Expected<const coff_resource_dir_table &> ResourceSectionRef::getBaseTable() {
return getTableAtOffset(0);
}
-
-Expected<const coff_resource_dir_entry &>
-ResourceSectionRef::getTableEntry(const coff_resource_dir_table &Table,
- uint32_t Index) {
- if (Index >= (uint32_t)(Table.NumberOfNameEntries + Table.NumberOfIDEntries))
- return createStringError(object_error::parse_failed, "index out of range");
- const uint8_t *TablePtr = reinterpret_cast<const uint8_t *>(&Table);
- ptrdiff_t TableOffset = TablePtr - BBS.data().data();
- return getTableEntryAtOffset(TableOffset + sizeof(Table) +
- Index * sizeof(coff_resource_dir_entry));
-}
-
-Error ResourceSectionRef::load(const COFFObjectFile *O) {
- for (const SectionRef &S : O->sections()) {
- Expected<StringRef> Name = S.getName();
- if (!Name)
- return Name.takeError();
-
- if (*Name == ".rsrc" || *Name == ".rsrc$01")
- return load(O, S);
- }
- return createStringError(object_error::parse_failed,
- "no resource section found");
-}
-
-Error ResourceSectionRef::load(const COFFObjectFile *O, const SectionRef &S) {
- Obj = O;
- Section = S;
- Expected<StringRef> Contents = Section.getContents();
- if (!Contents)
- return Contents.takeError();
- BBS = BinaryByteStream(*Contents, support::little);
- const coff_section *COFFSect = Obj->getCOFFSection(Section);
- ArrayRef<coff_relocation> OrigRelocs = Obj->getRelocations(COFFSect);
- Relocs.reserve(OrigRelocs.size());
- for (const coff_relocation &R : OrigRelocs)
- Relocs.push_back(&R);
- std::sort(Relocs.begin(), Relocs.end(),
- [](const coff_relocation *A, const coff_relocation *B) {
- return A->VirtualAddress < B->VirtualAddress;
- });
- return Error::success();
-}
-
-Expected<StringRef>
-ResourceSectionRef::getContents(const coff_resource_data_entry &Entry) {
- if (!Obj)
- return createStringError(object_error::parse_failed, "no object provided");
-
- // Find a potential relocation at the DataRVA field (first member of
- // the coff_resource_data_entry struct).
- const uint8_t *EntryPtr = reinterpret_cast<const uint8_t *>(&Entry);
- ptrdiff_t EntryOffset = EntryPtr - BBS.data().data();
- coff_relocation RelocTarget{ulittle32_t(EntryOffset), ulittle32_t(0),
- ulittle16_t(0)};
- auto RelocsForOffset =
- std::equal_range(Relocs.begin(), Relocs.end(), &RelocTarget,
- [](const coff_relocation *A, const coff_relocation *B) {
- return A->VirtualAddress < B->VirtualAddress;
- });
-
- if (RelocsForOffset.first != RelocsForOffset.second) {
- // We found a relocation with the right offset. Check that it does have
- // the expected type.
- const coff_relocation &R = **RelocsForOffset.first;
- uint16_t RVAReloc;
- switch (Obj->getMachine()) {
- case COFF::IMAGE_FILE_MACHINE_I386:
- RVAReloc = COFF::IMAGE_REL_I386_DIR32NB;
- break;
- case COFF::IMAGE_FILE_MACHINE_AMD64:
- RVAReloc = COFF::IMAGE_REL_AMD64_ADDR32NB;
- break;
- case COFF::IMAGE_FILE_MACHINE_ARMNT:
- RVAReloc = COFF::IMAGE_REL_ARM_ADDR32NB;
- break;
- case COFF::IMAGE_FILE_MACHINE_ARM64:
- RVAReloc = COFF::IMAGE_REL_ARM64_ADDR32NB;
- break;
- default:
- return createStringError(object_error::parse_failed,
- "unsupported architecture");
- }
- if (R.Type != RVAReloc)
- return createStringError(object_error::parse_failed,
- "unexpected relocation type");
- // Get the relocation's symbol
- Expected<COFFSymbolRef> Sym = Obj->getSymbol(R.SymbolTableIndex);
- if (!Sym)
- return Sym.takeError();
- const coff_section *Section = nullptr;
- // And the symbol's section
- if (std::error_code EC = Obj->getSection(Sym->getSectionNumber(), Section))
- return errorCodeToError(EC);
- // Add the initial value of DataRVA to the symbol's offset to find the
- // data it points at.
- uint64_t Offset = Entry.DataRVA + Sym->getValue();
- ArrayRef<uint8_t> Contents;
- if (Error E = Obj->getSectionContents(Section, Contents))
- return std::move(E);
- if (Offset + Entry.DataSize > Contents.size())
- return createStringError(object_error::parse_failed,
- "data outside of section");
- // Return a reference to the data inside the section.
- return StringRef(reinterpret_cast<const char *>(Contents.data()) + Offset,
- Entry.DataSize);
- } else {
- // Relocatable objects need a relocation for the DataRVA field.
- if (Obj->isRelocatableObject())
- return createStringError(object_error::parse_failed,
- "no relocation found for DataRVA");
-
- // Locate the section that contains the address that DataRVA points at.
- uint64_t VA = Entry.DataRVA + Obj->getImageBase();
- for (const SectionRef &S : Obj->sections()) {
- if (VA >= S.getAddress() &&
- VA + Entry.DataSize <= S.getAddress() + S.getSize()) {
- uint64_t Offset = VA - S.getAddress();
- Expected<StringRef> Contents = S.getContents();
- if (!Contents)
- return Contents.takeError();
- return Contents->slice(Offset, Offset + Entry.DataSize);
- }
- }
- return createStringError(object_error::parse_failed,
- "address not found in image");
- }
-}
diff --git a/contrib/llvm-project/llvm/lib/Object/Decompressor.cpp b/contrib/llvm-project/llvm/lib/Object/Decompressor.cpp
index 11efd857d1a1..ec15e6f69ada 100644
--- a/contrib/llvm-project/llvm/lib/Object/Decompressor.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/Decompressor.cpp
@@ -56,7 +56,7 @@ Error Decompressor::consumeCompressedZLibHeader(bool Is64Bit,
return createError("corrupted compressed section header");
DataExtractor Extractor(SectionData, IsLittleEndian, 0);
- uint64_t Offset = 0;
+ uint32_t Offset = 0;
if (Extractor.getUnsigned(&Offset, Is64Bit ? sizeof(Elf64_Word)
: sizeof(Elf32_Word)) !=
ELFCOMPRESS_ZLIB)
@@ -77,15 +77,10 @@ bool Decompressor::isGnuStyle(StringRef Name) {
}
bool Decompressor::isCompressed(const object::SectionRef &Section) {
- if (Section.isCompressed())
- return true;
-
- Expected<StringRef> SecNameOrErr = Section.getName();
- if (SecNameOrErr)
- return isGnuStyle(*SecNameOrErr);
-
- consumeError(SecNameOrErr.takeError());
- return false;
+ StringRef Name;
+ if (Section.getName(Name))
+ return false;
+ return Section.isCompressed() || isGnuStyle(Name);
}
bool Decompressor::isCompressedELFSection(uint64_t Flags, StringRef Name) {
diff --git a/contrib/llvm-project/llvm/lib/Object/ELF.cpp b/contrib/llvm-project/llvm/lib/Object/ELF.cpp
index f17a6da23d7d..8660b1a64bdd 100644
--- a/contrib/llvm-project/llvm/lib/Object/ELF.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/ELF.cpp
@@ -255,8 +255,6 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ADDRSIG);
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_DEPENDENT_LIBRARIES);
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_SYMPART);
- STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_PART_EHDR);
- STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_PART_PHDR);
STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES);
STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH);
STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef);
@@ -477,7 +475,7 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch,
#define PPC64_DYNAMIC_TAG(name, value)
// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
#define DYNAMIC_TAG_MARKER(name, value)
-#define DYNAMIC_TAG(name, value) case value: return #name;
+#define DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value)
#include "llvm/BinaryFormat/DynamicTags.def"
#undef DYNAMIC_TAG
#undef AARCH64_DYNAMIC_TAG
diff --git a/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp
index bf6ffd6c37b9..c7b715793048 100644
--- a/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp
@@ -43,16 +43,7 @@ const EnumEntry<unsigned> llvm::object::ElfSymbolTypes[NumElfSymbolTypes] = {
{"File", "FILE", ELF::STT_FILE},
{"Common", "COMMON", ELF::STT_COMMON},
{"TLS", "TLS", ELF::STT_TLS},
- {"Unknown", "<unknown>: 7", 7},
- {"Unknown", "<unknown>: 8", 8},
- {"Unknown", "<unknown>: 9", 9},
- {"GNU_IFunc", "IFUNC", ELF::STT_GNU_IFUNC},
- {"OS Specific", "<OS specific>: 11", 11},
- {"OS Specific", "<OS specific>: 12", 12},
- {"Proc Specific", "<processor specific>: 13", 13},
- {"Proc Specific", "<processor specific>: 14", 14},
- {"Proc Specific", "<processor specific>: 15", 15}
-};
+ {"GNU_IFunc", "IFUNC", ELF::STT_GNU_IFUNC}};
ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source)
: ObjectFile(Type, Source) {}
@@ -63,7 +54,7 @@ createPtr(MemoryBufferRef Object) {
auto Ret = ELFObjectFile<ELFT>::create(Object);
if (Error E = Ret.takeError())
return std::move(E);
- return std::make_unique<ELFObjectFile<ELFT>>(std::move(*Ret));
+ return make_unique<ELFObjectFile<ELFT>>(std::move(*Ret));
}
Expected<std::unique_ptr<ObjectFile>>
@@ -203,7 +194,7 @@ SubtargetFeatures ELFObjectFileBase::getARMFeatures() const {
default:
break;
case ARMBuildAttrs::Not_Allowed:
- Features.AddFeature("vfp2sp", false);
+ Features.AddFeature("vfp2d16sp", false);
Features.AddFeature("vfp3d16sp", false);
Features.AddFeature("vfp4d16sp", false);
break;
@@ -356,21 +347,6 @@ void ELFObjectFileBase::setARMSubArch(Triple &TheTriple) const {
case ARMBuildAttrs::v7E_M:
Triple += "v7em";
break;
- case ARMBuildAttrs::v8_A:
- Triple += "v8a";
- break;
- case ARMBuildAttrs::v8_R:
- Triple += "v8r";
- break;
- case ARMBuildAttrs::v8_M_Base:
- Triple += "v8m.base";
- break;
- case ARMBuildAttrs::v8_M_Main:
- Triple += "v8m.main";
- break;
- case ARMBuildAttrs::v8_1_M_Main:
- Triple += "v8.1m.main";
- break;
}
}
if (!isLittleEndian())
@@ -407,13 +383,9 @@ ELFObjectFileBase::getPltAddresses() const {
return {};
Optional<SectionRef> Plt = None, RelaPlt = None, GotPlt = None;
for (const SectionRef &Section : sections()) {
- Expected<StringRef> NameOrErr = Section.getName();
- if (!NameOrErr) {
- consumeError(NameOrErr.takeError());
+ StringRef Name;
+ if (Section.getName(Name))
continue;
- }
- StringRef Name = *NameOrErr;
-
if (Name == ".plt")
Plt = Section;
else if (Name == ".rela.plt" || Name == ".rel.plt")
diff --git a/contrib/llvm-project/llvm/lib/Object/MachOObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/MachOObjectFile.cpp
index 8540b7ab03cd..5aec844003c0 100644
--- a/contrib/llvm-project/llvm/lib/Object/MachOObjectFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/MachOObjectFile.cpp
@@ -57,6 +57,12 @@ namespace {
} // end anonymous namespace
+static const std::array<StringRef, 17> validArchs = {
+ "i386", "x86_64", "x86_64h", "armv4t", "arm", "armv5e",
+ "armv6", "armv6m", "armv7", "armv7em", "armv7k", "armv7m",
+ "armv7s", "arm64", "arm64_32", "ppc", "ppc64",
+};
+
static Error malformedError(const Twine &Msg) {
return make_error<GenericBinaryError>("truncated or malformed object (" +
Msg + ")",
@@ -128,10 +134,6 @@ static unsigned getCPUType(const MachOObjectFile &O) {
return O.getHeader().cputype;
}
-static unsigned getCPUSubType(const MachOObjectFile &O) {
- return O.getHeader().cpusubtype;
-}
-
static uint32_t
getPlainRelocationAddress(const MachO::any_relocation_info &RE) {
return RE.r_word0;
@@ -1949,11 +1951,6 @@ uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const {
return SectSize;
}
-ArrayRef<uint8_t> MachOObjectFile::getSectionContents(uint32_t Offset,
- uint64_t Size) const {
- return arrayRefFromStringRef(getData().substr(Offset, Size));
-}
-
Expected<ArrayRef<uint8_t>>
MachOObjectFile::getSectionContents(DataRefImpl Sec) const {
uint32_t Offset;
@@ -1969,7 +1966,7 @@ MachOObjectFile::getSectionContents(DataRefImpl Sec) const {
Size = Sect.size;
}
- return getSectionContents(Offset, Size);
+ return arrayRefFromStringRef(getData().substr(Offset, Size));
}
uint64_t MachOObjectFile::getSectionAlignment(DataRefImpl Sec) const {
@@ -1995,12 +1992,13 @@ Expected<SectionRef> MachOObjectFile::getSection(unsigned SectionIndex) const {
}
Expected<SectionRef> MachOObjectFile::getSection(StringRef SectionName) const {
+ StringRef SecName;
for (const SectionRef &Section : sections()) {
- auto NameOrErr = Section.getName();
- if (!NameOrErr)
- return NameOrErr.takeError();
- if (*NameOrErr == SectionName)
+ if (std::error_code E = Section.getName(SecName))
+ return errorCodeToError(E);
+ if (SecName == SectionName) {
return Section;
+ }
}
return errorCodeToError(object_error::parse_failed);
}
@@ -2569,7 +2567,7 @@ StringRef MachOObjectFile::getFileFormatName() const {
}
}
-Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType) {
+Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType) {
switch (CPUType) {
case MachO::CPU_TYPE_I386:
return Triple::x86;
@@ -2726,22 +2724,14 @@ Triple MachOObjectFile::getHostArch() {
}
bool MachOObjectFile::isValidArch(StringRef ArchFlag) {
- auto validArchs = getValidArchs();
- return llvm::find(validArchs, ArchFlag) != validArchs.end();
+ return std::find(validArchs.cbegin(), validArchs.cend(), ArchFlag) !=
+ validArchs.cend();
}
-ArrayRef<StringRef> MachOObjectFile::getValidArchs() {
- static const std::array<StringRef, 17> validArchs = {{
- "i386", "x86_64", "x86_64h", "armv4t", "arm", "armv5e",
- "armv6", "armv6m", "armv7", "armv7em", "armv7k", "armv7m",
- "armv7s", "arm64", "arm64_32", "ppc", "ppc64",
- }};
-
- return validArchs;
-}
+ArrayRef<StringRef> MachOObjectFile::getValidArchs() { return validArchs; }
Triple::ArchType MachOObjectFile::getArch() const {
- return getArch(getCPUType(*this), getCPUSubType(*this));
+ return getArch(getCPUType(*this));
}
Triple MachOObjectFile::getArchTriple(const char **McpuDefault) const {
@@ -3437,7 +3427,7 @@ iterator_range<rebase_iterator>
MachOObjectFile::rebaseTable(Error &Err, MachOObjectFile *O,
ArrayRef<uint8_t> Opcodes, bool is64) {
if (O->BindRebaseSectionTable == nullptr)
- O->BindRebaseSectionTable = std::make_unique<BindRebaseSegInfo>(O);
+ O->BindRebaseSectionTable = llvm::make_unique<BindRebaseSegInfo>(O);
MachORebaseEntry Start(&Err, O, Opcodes, is64);
Start.moveToFirst();
@@ -4003,11 +3993,7 @@ BindRebaseSegInfo::BindRebaseSegInfo(const object::MachOObjectFile *Obj) {
uint64_t CurSegAddress;
for (const SectionRef &Section : Obj->sections()) {
SectionInfo Info;
- Expected<StringRef> NameOrErr = Section.getName();
- if (!NameOrErr)
- consumeError(NameOrErr.takeError());
- else
- Info.SectionName = *NameOrErr;
+ Section.getName(Info.SectionName);
Info.Address = Section.getAddress();
Info.Size = Section.getSize();
Info.SegmentName =
@@ -4108,7 +4094,7 @@ MachOObjectFile::bindTable(Error &Err, MachOObjectFile *O,
ArrayRef<uint8_t> Opcodes, bool is64,
MachOBindEntry::Kind BKind) {
if (O->BindRebaseSectionTable == nullptr)
- O->BindRebaseSectionTable = std::make_unique<BindRebaseSegInfo>(O);
+ O->BindRebaseSectionTable = llvm::make_unique<BindRebaseSegInfo>(O);
MachOBindEntry Start(&Err, O, Opcodes, is64, BKind);
Start.moveToFirst();
@@ -4624,7 +4610,7 @@ void MachOObjectFile::ReadULEB128s(uint64_t Index,
SmallVectorImpl<uint64_t> &Out) const {
DataExtractor extractor(ObjectFile::getData(), true, 0);
- uint64_t offset = Index;
+ uint32_t offset = Index;
uint64_t data = 0;
while (uint64_t delta = extractor.getULEB128(&offset)) {
data += delta;
diff --git a/contrib/llvm-project/llvm/lib/Object/MachOUniversal.cpp b/contrib/llvm-project/llvm/lib/Object/MachOUniversal.cpp
index a178ecde949e..b3f0993412c6 100644
--- a/contrib/llvm-project/llvm/lib/Object/MachOUniversal.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/MachOUniversal.cpp
@@ -155,16 +155,15 @@ MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source, Error &Err)
") extends past the end of the file");
return;
}
-
- if (A.getAlign() > MaxSectionAlignment) {
- Err = malformedError("align (2^" + Twine(A.getAlign()) +
- ") too large for cputype (" + Twine(A.getCPUType()) +
- ") cpusubtype (" +
- Twine(A.getCPUSubType() & ~MachO::CPU_SUBTYPE_MASK) +
- ") (maximum 2^" + Twine(MaxSectionAlignment) + ")");
+#define MAXSECTALIGN 15 /* 2**15 or 0x8000 */
+ if (A.getAlign() > MAXSECTALIGN) {
+ Err = malformedError("align (2^" + Twine(A.getAlign()) + ") too large "
+ "for cputype (" + Twine(A.getCPUType()) + ") cpusubtype (" +
+ Twine(A.getCPUSubType() & ~MachO::CPU_SUBTYPE_MASK) +
+ ") (maximum 2^" + Twine(MAXSECTALIGN) + ")");
return;
}
- if(A.getOffset() % (1ull << A.getAlign()) != 0){
+ if(A.getOffset() % (1 << A.getAlign()) != 0){
Err = malformedError("offset: " + Twine(A.getOffset()) +
" for cputype (" + Twine(A.getCPUType()) + ") cpusubtype (" +
Twine(A.getCPUSubType() & ~MachO::CPU_SUBTYPE_MASK) +
@@ -210,34 +209,19 @@ MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source, Error &Err)
Err = Error::success();
}
-Expected<MachOUniversalBinary::ObjectForArch>
+Expected<std::unique_ptr<MachOObjectFile>>
MachOUniversalBinary::getObjectForArch(StringRef ArchName) const {
if (Triple(ArchName).getArch() == Triple::ArchType::UnknownArch)
return make_error<GenericBinaryError>("Unknown architecture "
"named: " +
ArchName,
object_error::arch_not_found);
- for (const auto &Obj : objects())
+
+ for (auto &Obj : objects())
if (Obj.getArchFlagName() == ArchName)
- return Obj;
+ return Obj.getAsObjectFile();
return make_error<GenericBinaryError>("fat file does not "
"contain " +
ArchName,
object_error::arch_not_found);
}
-
-Expected<std::unique_ptr<MachOObjectFile>>
-MachOUniversalBinary::getMachOObjectForArch(StringRef ArchName) const {
- Expected<ObjectForArch> O = getObjectForArch(ArchName);
- if (!O)
- return O.takeError();
- return O->getAsObjectFile();
-}
-
-Expected<std::unique_ptr<Archive>>
-MachOUniversalBinary::getArchiveForArch(StringRef ArchName) const {
- Expected<ObjectForArch> O = getObjectForArch(ArchName);
- if (!O)
- return O.takeError();
- return O->getAsArchive();
-}
diff --git a/contrib/llvm-project/llvm/lib/Object/Minidump.cpp b/contrib/llvm-project/llvm/lib/Object/Minidump.cpp
index 3e932fe7be28..7b5b21558699 100644
--- a/contrib/llvm-project/llvm/lib/Object/Minidump.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/Minidump.cpp
@@ -53,30 +53,13 @@ Expected<std::string> MinidumpFile::getString(size_t Offset) const {
return Result;
}
-Expected<iterator_range<MinidumpFile::MemoryInfoIterator>>
-MinidumpFile::getMemoryInfoList() const {
- Optional<ArrayRef<uint8_t>> Stream = getRawStream(StreamType::MemoryInfoList);
- if (!Stream)
- return createError("No such stream");
- auto ExpectedHeader =
- getDataSliceAs<minidump::MemoryInfoListHeader>(*Stream, 0, 1);
- if (!ExpectedHeader)
- return ExpectedHeader.takeError();
- const minidump::MemoryInfoListHeader &H = ExpectedHeader.get()[0];
- Expected<ArrayRef<uint8_t>> Data =
- getDataSlice(*Stream, H.SizeOfHeader, H.SizeOfEntry * H.NumberOfEntries);
- if (!Data)
- return Data.takeError();
- return make_range(MemoryInfoIterator(*Data, H.SizeOfEntry),
- MemoryInfoIterator({}, H.SizeOfEntry));
-}
-
template <typename T>
-Expected<ArrayRef<T>> MinidumpFile::getListStream(StreamType Type) const {
- Optional<ArrayRef<uint8_t>> Stream = getRawStream(Type);
- if (!Stream)
+Expected<ArrayRef<T>> MinidumpFile::getListStream(StreamType Stream) const {
+ auto OptionalStream = getRawStream(Stream);
+ if (!OptionalStream)
return createError("No such stream");
- auto ExpectedSize = getDataSliceAs<support::ulittle32_t>(*Stream, 0, 1);
+ auto ExpectedSize =
+ getDataSliceAs<support::ulittle32_t>(*OptionalStream, 0, 1);
if (!ExpectedSize)
return ExpectedSize.takeError();
@@ -86,10 +69,10 @@ Expected<ArrayRef<T>> MinidumpFile::getListStream(StreamType Type) const {
// Some producers insert additional padding bytes to align the list to an
// 8-byte boundary. Check for that by comparing the list size with the overall
// stream size.
- if (ListOffset + sizeof(T) * ListSize < Stream->size())
+ if (ListOffset + sizeof(T) * ListSize < OptionalStream->size())
ListOffset = 8;
- return getDataSliceAs<T>(*Stream, ListOffset, ListSize);
+ return getDataSliceAs<T>(*OptionalStream, ListOffset, ListSize);
}
template Expected<ArrayRef<Module>>
MinidumpFile::getListStream(StreamType) const;
@@ -126,14 +109,13 @@ MinidumpFile::create(MemoryBufferRef Source) {
return ExpectedStreams.takeError();
DenseMap<StreamType, std::size_t> StreamMap;
- for (const auto &StreamDescriptor : llvm::enumerate(*ExpectedStreams)) {
- StreamType Type = StreamDescriptor.value().Type;
- const LocationDescriptor &Loc = StreamDescriptor.value().Location;
+ for (const auto &Stream : llvm::enumerate(*ExpectedStreams)) {
+ StreamType Type = Stream.value().Type;
+ const LocationDescriptor &Loc = Stream.value().Location;
- Expected<ArrayRef<uint8_t>> Stream =
- getDataSlice(Data, Loc.RVA, Loc.DataSize);
- if (!Stream)
- return Stream.takeError();
+ auto ExpectedStream = getDataSlice(Data, Loc.RVA, Loc.DataSize);
+ if (!ExpectedStream)
+ return ExpectedStream.takeError();
if (Type == StreamType::Unused && Loc.DataSize == 0) {
// Ignore dummy streams. This is technically ill-formed, but a number of
@@ -146,7 +128,7 @@ MinidumpFile::create(MemoryBufferRef Source) {
return createError("Cannot handle one of the minidump streams");
// Update the directory map, checking for duplicate stream types.
- if (!StreamMap.try_emplace(Type, StreamDescriptor.index()).second)
+ if (!StreamMap.try_emplace(Type, Stream.index()).second)
return createError("Duplicate stream type");
}
diff --git a/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp b/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp
index 17ac4afda2d6..d1e0ce5edae1 100644
--- a/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp
@@ -83,8 +83,7 @@ initializeRecordStreamer(const Module &M,
if (!MRI)
return;
- MCTargetOptions MCOptions;
- std::unique_ptr<MCAsmInfo> MAI(T->createMCAsmInfo(*MRI, TT.str(), MCOptions));
+ std::unique_ptr<MCAsmInfo> MAI(T->createMCAsmInfo(*MRI, TT.str()));
if (!MAI)
return;
@@ -110,6 +109,7 @@ initializeRecordStreamer(const Module &M,
std::unique_ptr<MCAsmParser> Parser(
createMCAsmParser(SrcMgr, MCCtx, Streamer, *MAI));
+ MCTargetOptions MCOptions;
std::unique_ptr<MCTargetAsmParser> TAP(
T->createMCAsmParser(*STI, *Parser, *MCII, MCOptions));
if (!TAP)
diff --git a/contrib/llvm-project/llvm/lib/Object/Object.cpp b/contrib/llvm-project/llvm/lib/Object/Object.cpp
index b486e9f5c9a8..d84798cc6dd0 100644
--- a/contrib/llvm-project/llvm/lib/Object/Object.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/Object.cpp
@@ -138,7 +138,7 @@ LLVMBinaryRef LLVMMachOUniversalBinaryCopyObjectForArch(LLVMBinaryRef BR,
char **ErrorMessage) {
auto universal = cast<MachOUniversalBinary>(unwrap(BR));
Expected<std::unique_ptr<ObjectFile>> ObjOrErr(
- universal->getMachOObjectForArch({Arch, ArchLen}));
+ universal->getObjectForArch({Arch, ArchLen}));
if (!ObjOrErr) {
*ErrorMessage = strdup(toString(ObjOrErr.takeError()).c_str());
return nullptr;
@@ -251,10 +251,10 @@ void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) {
// SectionRef accessors
const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
- auto NameOrErr = (*unwrap(SI))->getName();
- if (!NameOrErr)
- report_fatal_error(NameOrErr.takeError());
- return NameOrErr->data();
+ StringRef ret;
+ if (std::error_code ec = (*unwrap(SI))->getName(ret))
+ report_fatal_error(ec.message());
+ return ret.data();
}
uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
diff --git a/contrib/llvm-project/llvm/lib/Object/ObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/ObjectFile.cpp
index 098b3d8f8dd0..101f5dcc0821 100644
--- a/contrib/llvm-project/llvm/lib/Object/ObjectFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/ObjectFile.cpp
@@ -32,13 +32,6 @@
using namespace llvm;
using namespace object;
-raw_ostream &object::operator<<(raw_ostream &OS, const SectionedAddress &Addr) {
- OS << "SectionedAddress{" << format_hex(Addr.Address, 10);
- if (Addr.SectionIndex != SectionedAddress::UndefSection)
- OS << ", " << Addr.SectionIndex;
- return OS << "}";
-}
-
void ObjectFile::anchor() {}
ObjectFile::ObjectFile(unsigned int Type, MemoryBufferRef Source)
@@ -74,10 +67,8 @@ Error ObjectFile::printSymbolName(raw_ostream &OS, DataRefImpl Symb) const {
uint32_t ObjectFile::getSymbolAlignment(DataRefImpl DRI) const { return 0; }
bool ObjectFile::isSectionBitcode(DataRefImpl Sec) const {
- Expected<StringRef> NameOrErr = getSectionName(Sec);
- if (NameOrErr)
+ if (Expected<StringRef> NameOrErr = getSectionName(Sec))
return *NameOrErr == ".llvmbc";
- consumeError(NameOrErr.takeError());
return false;
}
@@ -91,8 +82,7 @@ bool ObjectFile::isBerkeleyData(DataRefImpl Sec) const {
return isSectionData(Sec);
}
-Expected<section_iterator>
-ObjectFile::getRelocatedSection(DataRefImpl Sec) const {
+section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const {
return section_iterator(SectionRef(Sec, this));
}
@@ -113,7 +103,7 @@ Triple ObjectFile::makeTriple() const {
TheTriple.setObjectFormat(Triple::MachO);
if (isCOFF()) {
- const auto COFFObj = cast<COFFObjectFile>(this);
+ const auto COFFObj = dyn_cast<COFFObjectFile>(this);
if (COFFObj->getArch() == Triple::thumb)
TheTriple.setTriple("thumbv7-windows");
}
@@ -137,8 +127,6 @@ ObjectFile::createObjectFile(MemoryBufferRef Object, file_magic Type) {
case file_magic::pdb:
case file_magic::minidump:
return errorCodeToError(object_error::invalid_file_type);
- case file_magic::tapi_file:
- return errorCodeToError(object_error::invalid_file_type);
case file_magic::elf:
case file_magic::elf_relocatable:
case file_magic::elf_executable:
diff --git a/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp b/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp
index 31478be7899e..55b315a20d17 100644
--- a/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp
@@ -30,7 +30,6 @@ static bool supportsX86_64(uint64_t Type) {
case ELF::R_X86_64_DTPOFF32:
case ELF::R_X86_64_DTPOFF64:
case ELF::R_X86_64_PC32:
- case ELF::R_X86_64_PC64:
case ELF::R_X86_64_32:
case ELF::R_X86_64_32S:
return true;
@@ -48,7 +47,6 @@ static uint64_t resolveX86_64(RelocationRef R, uint64_t S, uint64_t A) {
case ELF::R_X86_64_DTPOFF64:
return S + getELFAddend(R);
case ELF::R_X86_64_PC32:
- case ELF::R_X86_64_PC64:
return S + getELFAddend(R) - R.getOffset();
case ELF::R_X86_64_32:
case ELF::R_X86_64_32S:
@@ -339,7 +337,6 @@ static bool supportsRISCV(uint64_t Type) {
switch (Type) {
case ELF::R_RISCV_NONE:
case ELF::R_RISCV_32:
- case ELF::R_RISCV_32_PCREL:
case ELF::R_RISCV_64:
case ELF::R_RISCV_SET6:
case ELF::R_RISCV_SUB6:
@@ -364,14 +361,12 @@ static uint64_t resolveRISCV(RelocationRef R, uint64_t S, uint64_t A) {
return A;
case ELF::R_RISCV_32:
return (S + RA) & 0xFFFFFFFF;
- case ELF::R_RISCV_32_PCREL:
- return (S + RA - R.getOffset()) & 0xFFFFFFFF;
case ELF::R_RISCV_64:
return S + RA;
case ELF::R_RISCV_SET6:
- return (A & 0xC0) | ((S + RA) & 0x3F);
+ return (A + (S + RA)) & 0xFF;
case ELF::R_RISCV_SUB6:
- return (A & 0xC0) | (((A & 0x3F) - (S + RA)) & 0x3F);
+ return (A - (S + RA)) & 0xFF;
case ELF::R_RISCV_ADD8:
return (A + (S + RA)) & 0xFF;
case ELF::R_RISCV_SUB8:
@@ -434,47 +429,6 @@ static uint64_t resolveCOFFX86_64(RelocationRef R, uint64_t S, uint64_t A) {
}
}
-static bool supportsCOFFARM(uint64_t Type) {
- switch (Type) {
- case COFF::IMAGE_REL_ARM_SECREL:
- case COFF::IMAGE_REL_ARM_ADDR32:
- return true;
- default:
- return false;
- }
-}
-
-static uint64_t resolveCOFFARM(RelocationRef R, uint64_t S, uint64_t A) {
- switch (R.getType()) {
- case COFF::IMAGE_REL_ARM_SECREL:
- case COFF::IMAGE_REL_ARM_ADDR32:
- return (S + A) & 0xFFFFFFFF;
- default:
- llvm_unreachable("Invalid relocation type");
- }
-}
-
-static bool supportsCOFFARM64(uint64_t Type) {
- switch (Type) {
- case COFF::IMAGE_REL_ARM64_SECREL:
- case COFF::IMAGE_REL_ARM64_ADDR64:
- return true;
- default:
- return false;
- }
-}
-
-static uint64_t resolveCOFFARM64(RelocationRef R, uint64_t S, uint64_t A) {
- switch (R.getType()) {
- case COFF::IMAGE_REL_ARM64_SECREL:
- return (S + A) & 0xFFFFFFFF;
- case COFF::IMAGE_REL_ARM64_ADDR64:
- return S + A;
- default:
- llvm_unreachable("Invalid relocation type");
- }
-}
-
static bool supportsMachOX86_64(uint64_t Type) {
return Type == MachO::X86_64_RELOC_UNSIGNED;
}
@@ -527,19 +481,9 @@ static uint64_t resolveWasm32(RelocationRef R, uint64_t S, uint64_t A) {
std::pair<bool (*)(uint64_t), RelocationResolver>
getRelocationResolver(const ObjectFile &Obj) {
if (Obj.isCOFF()) {
- switch (Obj.getArch()) {
- case Triple::x86_64:
+ if (Obj.getBytesInAddress() == 8)
return {supportsCOFFX86_64, resolveCOFFX86_64};
- case Triple::x86:
- return {supportsCOFFX86, resolveCOFFX86};
- case Triple::arm:
- case Triple::thumb:
- return {supportsCOFFARM, resolveCOFFARM};
- case Triple::aarch64:
- return {supportsCOFFARM64, resolveCOFFARM64};
- default:
- return {nullptr, nullptr};
- }
+ return {supportsCOFFX86, resolveCOFFX86};
} else if (Obj.isELF()) {
if (Obj.getBytesInAddress() == 8) {
switch (Obj.getArch()) {
diff --git a/contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp b/contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp
index 3db4ad9ed14b..2b152b7d8da3 100644
--- a/contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp
@@ -53,7 +53,6 @@ SymbolicFile::createSymbolicFile(MemoryBufferRef Object, file_magic Type,
case file_magic::windows_resource:
case file_magic::pdb:
case file_magic::minidump:
- case file_magic::tapi_file:
return errorCodeToError(object_error::invalid_file_type);
case file_magic::elf:
case file_magic::elf_executable:
diff --git a/contrib/llvm-project/llvm/lib/Object/TapiFile.cpp b/contrib/llvm-project/llvm/lib/Object/TapiFile.cpp
deleted file mode 100644
index c409bd8e5995..000000000000
--- a/contrib/llvm-project/llvm/lib/Object/TapiFile.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-//===- TapiFile.cpp -------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the Text-based Dynamcic Library Stub format.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Object/TapiFile.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Object/Error.h"
-#include "llvm/Support/MemoryBuffer.h"
-
-using namespace llvm;
-using namespace MachO;
-using namespace object;
-
-static constexpr StringLiteral ObjC1ClassNamePrefix = ".objc_class_name_";
-static constexpr StringLiteral ObjC2ClassNamePrefix = "_OBJC_CLASS_$_";
-static constexpr StringLiteral ObjC2MetaClassNamePrefix = "_OBJC_METACLASS_$_";
-static constexpr StringLiteral ObjC2EHTypePrefix = "_OBJC_EHTYPE_$_";
-static constexpr StringLiteral ObjC2IVarPrefix = "_OBJC_IVAR_$_";
-
-static uint32_t getFlags(const Symbol *Sym) {
- uint32_t Flags = BasicSymbolRef::SF_Global;
- if (Sym->isUndefined())
- Flags |= BasicSymbolRef::SF_Undefined;
- else
- Flags |= BasicSymbolRef::SF_Exported;
-
- if (Sym->isWeakDefined() || Sym->isWeakReferenced())
- Flags |= BasicSymbolRef::SF_Weak;
-
- return Flags;
-}
-
-TapiFile::TapiFile(MemoryBufferRef Source, const InterfaceFile &interface,
- Architecture Arch)
- : SymbolicFile(ID_TapiFile, Source) {
- for (const auto *Symbol : interface.symbols()) {
- if (!Symbol->getArchitectures().has(Arch))
- continue;
-
- switch (Symbol->getKind()) {
- case SymbolKind::GlobalSymbol:
- Symbols.emplace_back(StringRef(), Symbol->getName(), getFlags(Symbol));
- break;
- case SymbolKind::ObjectiveCClass:
- if (interface.getPlatforms().count(PlatformKind::macOS) &&
- Arch == AK_i386) {
- Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(),
- getFlags(Symbol));
- } else {
- Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(),
- getFlags(Symbol));
- Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(),
- getFlags(Symbol));
- }
- break;
- case SymbolKind::ObjectiveCClassEHType:
- Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(),
- getFlags(Symbol));
- break;
- case SymbolKind::ObjectiveCInstanceVariable:
- Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(),
- getFlags(Symbol));
- break;
- }
- }
-}
-
-TapiFile::~TapiFile() = default;
-
-void TapiFile::moveSymbolNext(DataRefImpl &DRI) const {
- const auto *Sym = reinterpret_cast<const Symbol *>(DRI.p);
- DRI.p = reinterpret_cast<uintptr_t>(++Sym);
-}
-
-Error TapiFile::printSymbolName(raw_ostream &OS, DataRefImpl DRI) const {
- const auto *Sym = reinterpret_cast<const Symbol *>(DRI.p);
- OS << Sym->Prefix << Sym->Name;
- return Error::success();
-}
-
-uint32_t TapiFile::getSymbolFlags(DataRefImpl DRI) const {
- const auto *Sym = reinterpret_cast<const Symbol *>(DRI.p);
- return Sym->Flags;
-}
-
-basic_symbol_iterator TapiFile::symbol_begin() const {
- DataRefImpl DRI;
- DRI.p = reinterpret_cast<uintptr_t>(&*Symbols.begin());
- return BasicSymbolRef{DRI, this};
-}
-
-basic_symbol_iterator TapiFile::symbol_end() const {
- DataRefImpl DRI;
- DRI.p = reinterpret_cast<uintptr_t>(&*Symbols.end());
- return BasicSymbolRef{DRI, this};
-}
diff --git a/contrib/llvm-project/llvm/lib/Object/TapiUniversal.cpp b/contrib/llvm-project/llvm/lib/Object/TapiUniversal.cpp
deleted file mode 100644
index b3273e345a61..000000000000
--- a/contrib/llvm-project/llvm/lib/Object/TapiUniversal.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-//===- TapiUniversal.cpp --------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the Text-based Dynamic Library Stub format.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Object/TapiUniversal.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Object/Error.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/TextAPI/MachO/TextAPIReader.h"
-
-using namespace llvm;
-using namespace MachO;
-using namespace object;
-
-TapiUniversal::TapiUniversal(MemoryBufferRef Source, Error &Err)
- : Binary(ID_TapiUniversal, Source) {
- auto Result = TextAPIReader::get(Source);
- ErrorAsOutParameter ErrAsOuParam(&Err);
- if (!Result) {
- Err = Result.takeError();
- return;
- }
- ParsedFile = std::move(Result.get());
-
- auto Archs = ParsedFile->getArchitectures();
- for (auto Arch : Archs)
- Architectures.emplace_back(Arch);
-}
-
-TapiUniversal::~TapiUniversal() = default;
-
-Expected<std::unique_ptr<TapiFile>>
-TapiUniversal::ObjectForArch::getAsObjectFile() const {
- return std::unique_ptr<TapiFile>(new TapiFile(Parent->getMemoryBufferRef(),
- *Parent->ParsedFile.get(),
- Parent->Architectures[Index]));
-}
-
-Expected<std::unique_ptr<TapiUniversal>>
-TapiUniversal::create(MemoryBufferRef Source) {
- Error Err = Error::success();
- std::unique_ptr<TapiUniversal> Ret(new TapiUniversal(Source, Err));
- if (Err)
- return std::move(Err);
- return std::move(Ret);
-}
diff --git a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp
index ab8918ce1919..82aa1830dced 100644
--- a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp
@@ -56,7 +56,7 @@ LLVM_DUMP_METHOD void WasmSymbol::dump() const { print(dbgs()); }
Expected<std::unique_ptr<WasmObjectFile>>
ObjectFile::createWasmObjectFile(MemoryBufferRef Buffer) {
Error Err = Error::success();
- auto ObjectFile = std::make_unique<WasmObjectFile>(Buffer, Err);
+ auto ObjectFile = llvm::make_unique<WasmObjectFile>(Buffer, Err);
if (Err)
return std::move(Err);
@@ -343,7 +343,7 @@ Error WasmObjectFile::parseDylinkSection(ReadContext &Ctx) {
Error WasmObjectFile::parseNameSection(ReadContext &Ctx) {
llvm::DenseSet<uint64_t> Seen;
- if (FunctionTypes.size() && !SeenCodeSection) {
+ if (Functions.size() != FunctionTypes.size()) {
return make_error<GenericBinaryError>("Names must come after code section",
object_error::parse_failed);
}
@@ -389,7 +389,7 @@ Error WasmObjectFile::parseNameSection(ReadContext &Ctx) {
Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) {
HasLinkingSection = true;
- if (FunctionTypes.size() && !SeenCodeSection) {
+ if (Functions.size() != FunctionTypes.size()) {
return make_error<GenericBinaryError>(
"Linking data must come after code section",
object_error::parse_failed);
@@ -781,7 +781,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
break;
case wasm::R_WASM_GLOBAL_INDEX_LEB:
// R_WASM_GLOBAL_INDEX_LEB are can be used against function and data
- // symbols to refer to their GOT entries.
+ // symbols to refer to thier GOT enties.
if (!isValidGlobalSymbol(Reloc.Index) &&
!isValidDataSymbol(Reloc.Index) &&
!isValidFunctionSymbol(Reloc.Index))
@@ -881,9 +881,12 @@ Error WasmObjectFile::parseTypeSection(ReadContext &Ctx) {
Sig.Params.push_back(wasm::ValType(ParamType));
}
uint32_t ReturnCount = readVaruint32(Ctx);
- while (ReturnCount--) {
- uint32_t ReturnType = readUint8(Ctx);
- Sig.Returns.push_back(wasm::ValType(ReturnType));
+ if (ReturnCount) {
+ if (ReturnCount != 1) {
+ return make_error<GenericBinaryError>(
+ "Multiple return types not supported", object_error::parse_failed);
+ }
+ Sig.Returns.push_back(wasm::ValType(readUint8(Ctx)));
}
Signatures.push_back(std::move(Sig));
}
@@ -940,7 +943,6 @@ Error WasmObjectFile::parseImportSection(ReadContext &Ctx) {
Error WasmObjectFile::parseFunctionSection(ReadContext &Ctx) {
uint32_t Count = readVaruint32(Ctx);
FunctionTypes.reserve(Count);
- Functions.resize(Count);
uint32_t NumTypes = Signatures.size();
while (Count--) {
uint32_t Type = readVaruint32(Ctx);
@@ -1030,11 +1032,9 @@ Error WasmObjectFile::parseExportSection(ReadContext &Ctx) {
Ex.Index = readVaruint32(Ctx);
switch (Ex.Kind) {
case wasm::WASM_EXTERNAL_FUNCTION:
-
- if (!isDefinedFunctionIndex(Ex.Index))
+ if (!isValidFunctionIndex(Ex.Index))
return make_error<GenericBinaryError>("Invalid function export",
object_error::parse_failed);
- getDefinedFunction(Ex.Index).ExportName = Ex.Name;
break;
case wasm::WASM_EXTERNAL_GLOBAL:
if (!isValidGlobalIndex(Ex.Index))
@@ -1135,7 +1135,6 @@ Error WasmObjectFile::parseStartSection(ReadContext &Ctx) {
}
Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) {
- SeenCodeSection = true;
CodeSection = Sections.size();
uint32_t FunctionCount = readVaruint32(Ctx);
if (FunctionCount != FunctionTypes.size()) {
@@ -1143,14 +1142,14 @@ Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) {
object_error::parse_failed);
}
- for (uint32_t i = 0; i < FunctionCount; i++) {
- wasm::WasmFunction& Function = Functions[i];
+ while (FunctionCount--) {
+ wasm::WasmFunction Function;
const uint8_t *FunctionStart = Ctx.Ptr;
uint32_t Size = readVaruint32(Ctx);
const uint8_t *FunctionEnd = Ctx.Ptr + Size;
Function.CodeOffset = Ctx.Ptr - FunctionStart;
- Function.Index = NumImportedFunctions + i;
+ Function.Index = NumImportedFunctions + Functions.size();
Function.CodeSectionOffset = FunctionStart - Ctx.Start;
Function.Size = FunctionEnd - FunctionStart;
@@ -1169,6 +1168,7 @@ Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) {
Function.Comdat = UINT32_MAX;
Ctx.Ptr += BodySize;
assert(Ctx.Ptr == FunctionEnd);
+ Functions.push_back(Function);
}
if (Ctx.Ptr != Ctx.End)
return make_error<GenericBinaryError>("Code section ended prematurely",
diff --git a/contrib/llvm-project/llvm/lib/Object/WindowsResource.cpp b/contrib/llvm-project/llvm/lib/Object/WindowsResource.cpp
index 10717718b201..d76e1231684c 100644
--- a/contrib/llvm-project/llvm/lib/Object/WindowsResource.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/WindowsResource.cpp
@@ -30,24 +30,15 @@ namespace object {
if (auto EC = X) \
return EC;
-#define UNWRAP_REF_OR_RETURN(Name, Expr) \
- auto Name##OrErr = Expr; \
- if (!Name##OrErr) \
- return Name##OrErr.takeError(); \
- const auto &Name = *Name##OrErr;
-
-#define UNWRAP_OR_RETURN(Name, Expr) \
- auto Name##OrErr = Expr; \
- if (!Name##OrErr) \
- return Name##OrErr.takeError(); \
- auto Name = *Name##OrErr;
-
const uint32_t MIN_HEADER_SIZE = 7 * sizeof(uint32_t) + 2 * sizeof(uint16_t);
// COFF files seem to be inconsistent with alignment between sections, just use
// 8-byte because it makes everyone happy.
const uint32_t SECTION_ALIGNMENT = sizeof(uint64_t);
+uint32_t WindowsResourceParser::TreeNode::StringCount = 0;
+uint32_t WindowsResourceParser::TreeNode::DataCount = 0;
+
WindowsResource::WindowsResource(MemoryBufferRef Source)
: Binary(Binary::ID_WinRes, Source) {
size_t LeadingSize = WIN_RES_MAGIC_SIZE + WIN_RES_NULL_ENTRY_SIZE;
@@ -137,8 +128,7 @@ Error ResourceEntryRef::loadNext() {
return Error::success();
}
-WindowsResourceParser::WindowsResourceParser(bool MinGW)
- : Root(false), MinGW(MinGW) {}
+WindowsResourceParser::WindowsResourceParser() : Root(false) {}
void printResourceTypeName(uint16_t TypeID, raw_ostream &OS) {
switch (TypeID) {
@@ -210,122 +200,6 @@ static std::string makeDuplicateResourceError(
return OS.str();
}
-static void printStringOrID(const WindowsResourceParser::StringOrID &S,
- raw_string_ostream &OS, bool IsType, bool IsID) {
- if (S.IsString) {
- std::string UTF8;
- if (!convertUTF16LEToUTF8String(S.String, UTF8))
- UTF8 = "(failed conversion from UTF16)";
- OS << '\"' << UTF8 << '\"';
- } else if (IsType)
- printResourceTypeName(S.ID, OS);
- else if (IsID)
- OS << "ID " << S.ID;
- else
- OS << S.ID;
-}
-
-static std::string makeDuplicateResourceError(
- const std::vector<WindowsResourceParser::StringOrID> &Context,
- StringRef File1, StringRef File2) {
- std::string Ret;
- raw_string_ostream OS(Ret);
-
- OS << "duplicate resource:";
-
- if (Context.size() >= 1) {
- OS << " type ";
- printStringOrID(Context[0], OS, /* IsType */ true, /* IsID */ true);
- }
-
- if (Context.size() >= 2) {
- OS << "/name ";
- printStringOrID(Context[1], OS, /* IsType */ false, /* IsID */ true);
- }
-
- if (Context.size() >= 3) {
- OS << "/language ";
- printStringOrID(Context[2], OS, /* IsType */ false, /* IsID */ false);
- }
- OS << ", in " << File1 << " and in " << File2;
-
- return OS.str();
-}
-
-// MinGW specific. Remove default manifests (with language zero) if there are
-// other manifests present, and report an error if there are more than one
-// manifest with a non-zero language code.
-// GCC has the concept of a default manifest resource object, which gets
-// linked in implicitly if present. This default manifest has got language
-// id zero, and should be dropped silently if there's another manifest present.
-// If the user resources surprisignly had a manifest with language id zero,
-// we should also ignore the duplicate default manifest.
-void WindowsResourceParser::cleanUpManifests(
- std::vector<std::string> &Duplicates) {
- auto TypeIt = Root.IDChildren.find(/* RT_MANIFEST */ 24);
- if (TypeIt == Root.IDChildren.end())
- return;
-
- TreeNode *TypeNode = TypeIt->second.get();
- auto NameIt =
- TypeNode->IDChildren.find(/* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 1);
- if (NameIt == TypeNode->IDChildren.end())
- return;
-
- TreeNode *NameNode = NameIt->second.get();
- if (NameNode->IDChildren.size() <= 1)
- return; // None or one manifest present, all good.
-
- // If we have more than one manifest, drop the language zero one if present,
- // and check again.
- auto LangZeroIt = NameNode->IDChildren.find(0);
- if (LangZeroIt != NameNode->IDChildren.end() &&
- LangZeroIt->second->IsDataNode) {
- uint32_t RemovedIndex = LangZeroIt->second->DataIndex;
- NameNode->IDChildren.erase(LangZeroIt);
- Data.erase(Data.begin() + RemovedIndex);
- Root.shiftDataIndexDown(RemovedIndex);
-
- // If we're now down to one manifest, all is good.
- if (NameNode->IDChildren.size() <= 1)
- return;
- }
-
- // More than one non-language-zero manifest
- auto FirstIt = NameNode->IDChildren.begin();
- uint32_t FirstLang = FirstIt->first;
- TreeNode *FirstNode = FirstIt->second.get();
- auto LastIt = NameNode->IDChildren.rbegin();
- uint32_t LastLang = LastIt->first;
- TreeNode *LastNode = LastIt->second.get();
- Duplicates.push_back(
- ("duplicate non-default manifests with languages " + Twine(FirstLang) +
- " in " + InputFilenames[FirstNode->Origin] + " and " + Twine(LastLang) +
- " in " + InputFilenames[LastNode->Origin])
- .str());
-}
-
-// Ignore duplicates of manifests with language zero (the default manifest),
-// in case the user has provided a manifest with that language id. See
-// the function comment above for context. Only returns true if MinGW is set
-// to true.
-bool WindowsResourceParser::shouldIgnoreDuplicate(
- const ResourceEntryRef &Entry) const {
- return MinGW && !Entry.checkTypeString() &&
- Entry.getTypeID() == /* RT_MANIFEST */ 24 &&
- !Entry.checkNameString() &&
- Entry.getNameID() == /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 1 &&
- Entry.getLanguage() == 0;
-}
-
-bool WindowsResourceParser::shouldIgnoreDuplicate(
- const std::vector<StringOrID> &Context) const {
- return MinGW && Context.size() == 3 && !Context[0].IsString &&
- Context[0].ID == /* RT_MANIFEST */ 24 && !Context[1].IsString &&
- Context[1].ID == /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 1 &&
- !Context[2].IsString && Context[2].ID == 0;
-}
-
Error WindowsResourceParser::parse(WindowsResource *WR,
std::vector<std::string> &Duplicates) {
auto EntryOrErr = WR->getHeadEntry();
@@ -345,176 +219,112 @@ Error WindowsResourceParser::parse(WindowsResource *WR,
}
ResourceEntryRef Entry = EntryOrErr.get();
- uint32_t Origin = InputFilenames.size();
- InputFilenames.push_back(WR->getFileName());
bool End = false;
while (!End) {
+ Data.push_back(Entry.getData());
- TreeNode *Node;
- bool IsNewNode = Root.addEntry(Entry, Origin, Data, StringTable, Node);
+ bool IsNewTypeString = false;
+ bool IsNewNameString = false;
+
+ TreeNode* Node;
+ bool IsNewNode = Root.addEntry(Entry, InputFilenames.size(),
+ IsNewTypeString, IsNewNameString, Node);
+ InputFilenames.push_back(WR->getFileName());
if (!IsNewNode) {
- if (!shouldIgnoreDuplicate(Entry))
- Duplicates.push_back(makeDuplicateResourceError(
- Entry, InputFilenames[Node->Origin], WR->getFileName()));
+ Duplicates.push_back(makeDuplicateResourceError(
+ Entry, InputFilenames[Node->Origin], WR->getFileName()));
}
+ if (IsNewTypeString)
+ StringTable.push_back(Entry.getTypeString());
+
+ if (IsNewNameString)
+ StringTable.push_back(Entry.getNameString());
+
RETURN_IF_ERROR(Entry.moveNext(End));
}
return Error::success();
}
-Error WindowsResourceParser::parse(ResourceSectionRef &RSR, StringRef Filename,
- std::vector<std::string> &Duplicates) {
- UNWRAP_REF_OR_RETURN(BaseTable, RSR.getBaseTable());
- uint32_t Origin = InputFilenames.size();
- InputFilenames.push_back(Filename);
- std::vector<StringOrID> Context;
- return addChildren(Root, RSR, BaseTable, Origin, Context, Duplicates);
-}
-
void WindowsResourceParser::printTree(raw_ostream &OS) const {
ScopedPrinter Writer(OS);
Root.print(Writer, "Resource Tree");
}
-bool WindowsResourceParser::TreeNode::addEntry(
- const ResourceEntryRef &Entry, uint32_t Origin,
- std::vector<std::vector<uint8_t>> &Data,
- std::vector<std::vector<UTF16>> &StringTable, TreeNode *&Result) {
- TreeNode &TypeNode = addTypeNode(Entry, StringTable);
- TreeNode &NameNode = TypeNode.addNameNode(Entry, StringTable);
- return NameNode.addLanguageNode(Entry, Origin, Data, Result);
+bool WindowsResourceParser::TreeNode::addEntry(const ResourceEntryRef &Entry,
+ uint32_t Origin,
+ bool &IsNewTypeString,
+ bool &IsNewNameString,
+ TreeNode *&Result) {
+ TreeNode &TypeNode = addTypeNode(Entry, IsNewTypeString);
+ TreeNode &NameNode = TypeNode.addNameNode(Entry, IsNewNameString);
+ return NameNode.addLanguageNode(Entry, Origin, Result);
}
-Error WindowsResourceParser::addChildren(TreeNode &Node,
- ResourceSectionRef &RSR,
- const coff_resource_dir_table &Table,
- uint32_t Origin,
- std::vector<StringOrID> &Context,
- std::vector<std::string> &Duplicates) {
-
- for (int i = 0; i < Table.NumberOfNameEntries + Table.NumberOfIDEntries;
- i++) {
- UNWRAP_REF_OR_RETURN(Entry, RSR.getTableEntry(Table, i));
- TreeNode *Child;
-
- if (Entry.Offset.isSubDir()) {
-
- // Create a new subdirectory and recurse
- if (i < Table.NumberOfNameEntries) {
- UNWRAP_OR_RETURN(NameString, RSR.getEntryNameString(Entry));
- Child = &Node.addNameChild(NameString, StringTable);
- Context.push_back(StringOrID(NameString));
- } else {
- Child = &Node.addIDChild(Entry.Identifier.ID);
- Context.push_back(StringOrID(Entry.Identifier.ID));
- }
-
- UNWRAP_REF_OR_RETURN(NextTable, RSR.getEntrySubDir(Entry));
- Error E =
- addChildren(*Child, RSR, NextTable, Origin, Context, Duplicates);
- if (E)
- return E;
- Context.pop_back();
-
- } else {
-
- // Data leaves are supposed to have a numeric ID as identifier (language).
- if (Table.NumberOfNameEntries > 0)
- return createStringError(object_error::parse_failed,
- "unexpected string key for data object");
-
- // Try adding a data leaf
- UNWRAP_REF_OR_RETURN(DataEntry, RSR.getEntryData(Entry));
- TreeNode *Child;
- Context.push_back(StringOrID(Entry.Identifier.ID));
- bool Added = Node.addDataChild(Entry.Identifier.ID, Table.MajorVersion,
- Table.MinorVersion, Table.Characteristics,
- Origin, Data.size(), Child);
- if (Added) {
- UNWRAP_OR_RETURN(Contents, RSR.getContents(DataEntry));
- Data.push_back(ArrayRef<uint8_t>(
- reinterpret_cast<const uint8_t *>(Contents.data()),
- Contents.size()));
- } else {
- if (!shouldIgnoreDuplicate(Context))
- Duplicates.push_back(makeDuplicateResourceError(
- Context, InputFilenames[Child->Origin], InputFilenames.back()));
- }
- Context.pop_back();
-
- }
- }
- return Error::success();
+WindowsResourceParser::TreeNode::TreeNode(bool IsStringNode) {
+ if (IsStringNode)
+ StringIndex = StringCount++;
}
-WindowsResourceParser::TreeNode::TreeNode(uint32_t StringIndex)
- : StringIndex(StringIndex) {}
-
WindowsResourceParser::TreeNode::TreeNode(uint16_t MajorVersion,
uint16_t MinorVersion,
uint32_t Characteristics,
- uint32_t Origin, uint32_t DataIndex)
- : IsDataNode(true), DataIndex(DataIndex), MajorVersion(MajorVersion),
- MinorVersion(MinorVersion), Characteristics(Characteristics),
- Origin(Origin) {}
+ uint32_t Origin)
+ : IsDataNode(true), MajorVersion(MajorVersion), MinorVersion(MinorVersion),
+ Characteristics(Characteristics), Origin(Origin) {
+ DataIndex = DataCount++;
+}
std::unique_ptr<WindowsResourceParser::TreeNode>
-WindowsResourceParser::TreeNode::createStringNode(uint32_t Index) {
- return std::unique_ptr<TreeNode>(new TreeNode(Index));
+WindowsResourceParser::TreeNode::createStringNode() {
+ return std::unique_ptr<TreeNode>(new TreeNode(true));
}
std::unique_ptr<WindowsResourceParser::TreeNode>
WindowsResourceParser::TreeNode::createIDNode() {
- return std::unique_ptr<TreeNode>(new TreeNode(0));
+ return std::unique_ptr<TreeNode>(new TreeNode(false));
}
std::unique_ptr<WindowsResourceParser::TreeNode>
WindowsResourceParser::TreeNode::createDataNode(uint16_t MajorVersion,
uint16_t MinorVersion,
uint32_t Characteristics,
- uint32_t Origin,
- uint32_t DataIndex) {
- return std::unique_ptr<TreeNode>(new TreeNode(
- MajorVersion, MinorVersion, Characteristics, Origin, DataIndex));
+ uint32_t Origin) {
+ return std::unique_ptr<TreeNode>(
+ new TreeNode(MajorVersion, MinorVersion, Characteristics, Origin));
}
-WindowsResourceParser::TreeNode &WindowsResourceParser::TreeNode::addTypeNode(
- const ResourceEntryRef &Entry,
- std::vector<std::vector<UTF16>> &StringTable) {
+WindowsResourceParser::TreeNode &
+WindowsResourceParser::TreeNode::addTypeNode(const ResourceEntryRef &Entry,
+ bool &IsNewTypeString) {
if (Entry.checkTypeString())
- return addNameChild(Entry.getTypeString(), StringTable);
+ return addNameChild(Entry.getTypeString(), IsNewTypeString);
else
return addIDChild(Entry.getTypeID());
}
-WindowsResourceParser::TreeNode &WindowsResourceParser::TreeNode::addNameNode(
- const ResourceEntryRef &Entry,
- std::vector<std::vector<UTF16>> &StringTable) {
+WindowsResourceParser::TreeNode &
+WindowsResourceParser::TreeNode::addNameNode(const ResourceEntryRef &Entry,
+ bool &IsNewNameString) {
if (Entry.checkNameString())
- return addNameChild(Entry.getNameString(), StringTable);
+ return addNameChild(Entry.getNameString(), IsNewNameString);
else
return addIDChild(Entry.getNameID());
}
bool WindowsResourceParser::TreeNode::addLanguageNode(
- const ResourceEntryRef &Entry, uint32_t Origin,
- std::vector<std::vector<uint8_t>> &Data, TreeNode *&Result) {
- bool Added = addDataChild(Entry.getLanguage(), Entry.getMajorVersion(),
- Entry.getMinorVersion(), Entry.getCharacteristics(),
- Origin, Data.size(), Result);
- if (Added)
- Data.push_back(Entry.getData());
- return Added;
+ const ResourceEntryRef &Entry, uint32_t Origin, TreeNode *&Result) {
+ return addDataChild(Entry.getLanguage(), Entry.getMajorVersion(),
+ Entry.getMinorVersion(), Entry.getCharacteristics(),
+ Origin, Result);
}
bool WindowsResourceParser::TreeNode::addDataChild(
uint32_t ID, uint16_t MajorVersion, uint16_t MinorVersion,
- uint32_t Characteristics, uint32_t Origin, uint32_t DataIndex,
- TreeNode *&Result) {
- auto NewChild = createDataNode(MajorVersion, MinorVersion, Characteristics,
- Origin, DataIndex);
+ uint32_t Characteristics, uint32_t Origin, TreeNode *&Result) {
+ auto NewChild =
+ createDataNode(MajorVersion, MinorVersion, Characteristics, Origin);
auto ElementInserted = IDChildren.emplace(ID, std::move(NewChild));
Result = ElementInserted.first->second.get();
return ElementInserted.second;
@@ -532,15 +342,16 @@ WindowsResourceParser::TreeNode &WindowsResourceParser::TreeNode::addIDChild(
return *(Child->second);
}
-WindowsResourceParser::TreeNode &WindowsResourceParser::TreeNode::addNameChild(
- ArrayRef<UTF16> NameRef, std::vector<std::vector<UTF16>> &StringTable) {
+WindowsResourceParser::TreeNode &
+WindowsResourceParser::TreeNode::addNameChild(ArrayRef<UTF16> NameRef,
+ bool &IsNewString) {
std::string NameString;
convertUTF16LEToUTF8String(NameRef, NameString);
auto Child = StringChildren.find(NameString);
if (Child == StringChildren.end()) {
- auto NewChild = createStringNode(StringTable.size());
- StringTable.push_back(NameRef);
+ auto NewChild = createStringNode();
+ IsNewString = true;
WindowsResourceParser::TreeNode &Node = *NewChild;
StringChildren.emplace(NameString, std::move(NewChild));
return Node;
@@ -585,19 +396,6 @@ uint32_t WindowsResourceParser::TreeNode::getTreeSize() const {
return Size;
}
-// Shift DataIndex of all data children with an Index greater or equal to the
-// given one, to fill a gap from removing an entry from the Data vector.
-void WindowsResourceParser::TreeNode::shiftDataIndexDown(uint32_t Index) {
- if (IsDataNode && DataIndex >= Index) {
- DataIndex--;
- } else {
- for (auto &Child : IDChildren)
- Child.second->shiftDataIndexDown(Index);
- for (auto &Child : StringChildren)
- Child.second->shiftDataIndexDown(Index);
- }
-}
-
class WindowsResourceCOFFWriter {
public:
WindowsResourceCOFFWriter(COFF::MachineTypes MachineType,
@@ -717,14 +515,6 @@ WindowsResourceCOFFWriter::write(uint32_t TimeDateStamp) {
return std::move(OutputBuffer);
}
-// According to COFF specification, if the Src has a size equal to Dest,
-// it's okay to *not* copy the trailing zero.
-static void coffnamecpy(char (&Dest)[COFF::NameSize], StringRef Src) {
- assert(Src.size() <= COFF::NameSize &&
- "Src is not larger than COFF::NameSize");
- strncpy(Dest, Src.data(), (size_t)COFF::NameSize);
-}
-
void WindowsResourceCOFFWriter::writeCOFFHeader(uint32_t TimeDateStamp) {
// Write the COFF header.
auto *Header = reinterpret_cast<coff_file_header *>(BufferStart);
@@ -744,7 +534,7 @@ void WindowsResourceCOFFWriter::writeFirstSectionHeader() {
CurrentOffset += sizeof(coff_file_header);
auto *SectionOneHeader =
reinterpret_cast<coff_section *>(BufferStart + CurrentOffset);
- coffnamecpy(SectionOneHeader->Name, ".rsrc$01");
+ strncpy(SectionOneHeader->Name, ".rsrc$01", (size_t)COFF::NameSize);
SectionOneHeader->VirtualSize = 0;
SectionOneHeader->VirtualAddress = 0;
SectionOneHeader->SizeOfRawData = SectionOneSize;
@@ -762,7 +552,7 @@ void WindowsResourceCOFFWriter::writeSecondSectionHeader() {
CurrentOffset += sizeof(coff_section);
auto *SectionTwoHeader =
reinterpret_cast<coff_section *>(BufferStart + CurrentOffset);
- coffnamecpy(SectionTwoHeader->Name, ".rsrc$02");
+ strncpy(SectionTwoHeader->Name, ".rsrc$02", (size_t)COFF::NameSize);
SectionTwoHeader->VirtualSize = 0;
SectionTwoHeader->VirtualAddress = 0;
SectionTwoHeader->SizeOfRawData = SectionTwoSize;
@@ -800,7 +590,7 @@ void WindowsResourceCOFFWriter::writeSymbolTable() {
// Now write the symbol table.
// First, the feat symbol.
auto *Symbol = reinterpret_cast<coff_symbol16 *>(BufferStart + CurrentOffset);
- coffnamecpy(Symbol->Name.ShortName, "@feat.00");
+ strncpy(Symbol->Name.ShortName, "@feat.00", (size_t)COFF::NameSize);
Symbol->Value = 0x11;
Symbol->SectionNumber = 0xffff;
Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
@@ -810,7 +600,7 @@ void WindowsResourceCOFFWriter::writeSymbolTable() {
// Now write the .rsrc1 symbol + aux.
Symbol = reinterpret_cast<coff_symbol16 *>(BufferStart + CurrentOffset);
- coffnamecpy(Symbol->Name.ShortName, ".rsrc$01");
+ strncpy(Symbol->Name.ShortName, ".rsrc$01", (size_t)COFF::NameSize);
Symbol->Value = 0;
Symbol->SectionNumber = 1;
Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
@@ -829,7 +619,7 @@ void WindowsResourceCOFFWriter::writeSymbolTable() {
// Now write the .rsrc2 symbol + aux.
Symbol = reinterpret_cast<coff_symbol16 *>(BufferStart + CurrentOffset);
- coffnamecpy(Symbol->Name.ShortName, ".rsrc$02");
+ strncpy(Symbol->Name.ShortName, ".rsrc$02", (size_t)COFF::NameSize);
Symbol->Value = 0;
Symbol->SectionNumber = 2;
Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
@@ -850,7 +640,7 @@ void WindowsResourceCOFFWriter::writeSymbolTable() {
for (unsigned i = 0; i < Data.size(); i++) {
auto RelocationName = formatv("$R{0:X-6}", i & 0xffffff).sstr<COFF::NameSize>();
Symbol = reinterpret_cast<coff_symbol16 *>(BufferStart + CurrentOffset);
- coffnamecpy(Symbol->Name.ShortName, RelocationName);
+ memcpy(Symbol->Name.ShortName, RelocationName.data(), (size_t) COFF::NameSize);
Symbol->Value = DataOffsets[i];
Symbol->SectionNumber = 2;
Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
diff --git a/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp
index f98cd69a0d37..602b7357986a 100644
--- a/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp
+++ b/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp
@@ -11,14 +11,17 @@
//===----------------------------------------------------------------------===//
#include "llvm/Object/XCOFFObjectFile.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/MathExtras.h"
#include <cstddef>
#include <cstring>
namespace llvm {
namespace object {
-enum { FUNCTION_SYM = 0x20, SYM_TYPE_MASK = 0x07, RELOC_OVERFLOW = 65535 };
-
// Checks that [Ptr, Ptr + Size) bytes fall inside the memory buffer
// 'M'. Returns a pointer to the underlying object on success.
template <typename T>
@@ -39,40 +42,10 @@ template <typename T> static const T *viewAs(uintptr_t in) {
return reinterpret_cast<const T *>(in);
}
-static StringRef generateXCOFFFixedNameStringRef(const char *Name) {
- auto NulCharPtr =
- static_cast<const char *>(memchr(Name, '\0', XCOFF::NameSize));
+static StringRef generateStringRef(const char *Name, uint64_t Size) {
+ auto NulCharPtr = static_cast<const char *>(memchr(Name, '\0', Size));
return NulCharPtr ? StringRef(Name, NulCharPtr - Name)
- : StringRef(Name, XCOFF::NameSize);
-}
-
-template <typename T> StringRef XCOFFSectionHeader<T>::getName() const {
- const T &DerivedXCOFFSectionHeader = static_cast<const T &>(*this);
- return generateXCOFFFixedNameStringRef(DerivedXCOFFSectionHeader.Name);
-}
-
-template <typename T> uint16_t XCOFFSectionHeader<T>::getSectionType() const {
- const T &DerivedXCOFFSectionHeader = static_cast<const T &>(*this);
- return DerivedXCOFFSectionHeader.Flags & SectionFlagsTypeMask;
-}
-
-template <typename T>
-bool XCOFFSectionHeader<T>::isReservedSectionType() const {
- return getSectionType() & SectionFlagsReservedMask;
-}
-
-bool XCOFFRelocation32::isRelocationSigned() const {
- return Info & XR_SIGN_INDICATOR_MASK;
-}
-
-bool XCOFFRelocation32::isFixupIndicated() const {
- return Info & XR_FIXUP_INDICATOR_MASK;
-}
-
-uint8_t XCOFFRelocation32::getRelocatedLength() const {
- // The relocation encodes the bit length being relocated minus 1. Add back
- // the 1 to get the actual length being relocated.
- return (Info & XR_BIASED_LENGTH_MASK) + 1;
+ : StringRef(Name, Size);
}
void XCOFFObjectFile::checkSectionAddress(uintptr_t Addr,
@@ -110,9 +83,6 @@ XCOFFObjectFile::toSection64(DataRefImpl Ref) const {
const XCOFFSymbolEntry *XCOFFObjectFile::toSymbolEntry(DataRefImpl Ref) const {
assert(!is64Bit() && "Symbol table support not implemented for 64-bit.");
assert(Ref.p != 0 && "Symbol table pointer can not be nullptr!");
-#ifndef NDEBUG
- checkSymbolEntryPointer(Ref.p);
-#endif
auto SymEntPtr = viewAs<XCOFFSymbolEntry>(Ref.p);
return SymEntPtr;
}
@@ -142,19 +112,23 @@ XCOFFObjectFile::sectionHeaderTable64() const {
void XCOFFObjectFile::moveSymbolNext(DataRefImpl &Symb) const {
const XCOFFSymbolEntry *SymEntPtr = toSymbolEntry(Symb);
SymEntPtr += SymEntPtr->NumberOfAuxEntries + 1;
-#ifndef NDEBUG
- // This function is used by basic_symbol_iterator, which allows to
- // point to the end-of-symbol-table address.
- if (reinterpret_cast<uintptr_t>(SymEntPtr) != getEndOfSymbolTableAddress())
- checkSymbolEntryPointer(reinterpret_cast<uintptr_t>(SymEntPtr));
-#endif
Symb.p = reinterpret_cast<uintptr_t>(SymEntPtr);
}
-Expected<StringRef>
-XCOFFObjectFile::getStringTableEntry(uint32_t Offset) const {
- // The byte offset is relative to the start of the string table.
- // A byte offset value of 0 is a null or zero-length symbol
+Expected<StringRef> XCOFFObjectFile::getSymbolName(DataRefImpl Symb) const {
+ const XCOFFSymbolEntry *SymEntPtr = toSymbolEntry(Symb);
+
+ if (SymEntPtr->NameInStrTbl.Magic != XCOFFSymbolEntry::NAME_IN_STR_TBL_MAGIC)
+ return generateStringRef(SymEntPtr->SymbolName, XCOFF::SymbolNameSize);
+
+ // A storage class value with the high-order bit on indicates that the name is
+ // a symbolic debugger stabstring.
+ if (SymEntPtr->StorageClass & 0x80)
+ return StringRef("Unimplemented Debug Name");
+
+ uint32_t Offset = SymEntPtr->NameInStrTbl.Offset;
+ // The byte offset is relative to the start of the string table
+ // or .debug section. A byte offset value of 0 is a null or zero-length symbol
// name. A byte offset in the range 1 to 3 (inclusive) points into the length
// field; as a soft-error recovery mechanism, we treat such cases as having an
// offset of 0.
@@ -164,39 +138,17 @@ XCOFFObjectFile::getStringTableEntry(uint32_t Offset) const {
if (StringTable.Data != nullptr && StringTable.Size > Offset)
return (StringTable.Data + Offset);
- return make_error<GenericBinaryError>("Bad offset for string table entry",
+ return make_error<GenericBinaryError>("Symbol Name parse failed",
object_error::parse_failed);
}
-Expected<StringRef>
-XCOFFObjectFile::getCFileName(const XCOFFFileAuxEnt *CFileEntPtr) const {
- if (CFileEntPtr->NameInStrTbl.Magic !=
- XCOFFSymbolEntry::NAME_IN_STR_TBL_MAGIC)
- return generateXCOFFFixedNameStringRef(CFileEntPtr->Name);
- return getStringTableEntry(CFileEntPtr->NameInStrTbl.Offset);
-}
-
-Expected<StringRef> XCOFFObjectFile::getSymbolName(DataRefImpl Symb) const {
- const XCOFFSymbolEntry *SymEntPtr = toSymbolEntry(Symb);
-
- // A storage class value with the high-order bit on indicates that the name is
- // a symbolic debugger stabstring.
- if (SymEntPtr->StorageClass & 0x80)
- return StringRef("Unimplemented Debug Name");
-
- if (SymEntPtr->NameInStrTbl.Magic != XCOFFSymbolEntry::NAME_IN_STR_TBL_MAGIC)
- return generateXCOFFFixedNameStringRef(SymEntPtr->SymbolName);
-
- return getStringTableEntry(SymEntPtr->NameInStrTbl.Offset);
-}
-
Expected<uint64_t> XCOFFObjectFile::getSymbolAddress(DataRefImpl Symb) const {
- assert(!is64Bit() && "Symbol table support not implemented for 64-bit.");
- return toSymbolEntry(Symb)->Value;
+ uint64_t Result = 0;
+ llvm_unreachable("Not yet implemented!");
+ return Result;
}
uint64_t XCOFFObjectFile::getSymbolValueImpl(DataRefImpl Symb) const {
- assert(!is64Bit() && "Symbol table support not implemented for 64-bit.");
return toSymbolEntry(Symb)->Value;
}
@@ -233,7 +185,7 @@ void XCOFFObjectFile::moveSectionNext(DataRefImpl &Sec) const {
}
Expected<StringRef> XCOFFObjectFile::getSectionName(DataRefImpl Sec) const {
- return generateXCOFFFixedNameStringRef(getSectionNameInternal(Sec));
+ return generateStringRef(getSectionNameInternal(Sec), XCOFF::SectionNameSize);
}
uint64_t XCOFFObjectFile::getSectionAddress(DataRefImpl Sec) const {
@@ -265,21 +217,7 @@ uint64_t XCOFFObjectFile::getSectionSize(DataRefImpl Sec) const {
Expected<ArrayRef<uint8_t>>
XCOFFObjectFile::getSectionContents(DataRefImpl Sec) const {
- if (isSectionVirtual(Sec))
- return ArrayRef<uint8_t>();
-
- uint64_t OffsetToRaw;
- if (is64Bit())
- OffsetToRaw = toSection64(Sec)->FileOffsetToRawData;
- else
- OffsetToRaw = toSection32(Sec)->FileOffsetToRawData;
-
- const uint8_t * ContentStart = base() + OffsetToRaw;
- uint64_t SectionSize = getSectionSize(Sec);
- if (checkOffset(Data, uintptr_t(ContentStart), SectionSize))
- return make_error<BinaryError>();
-
- return makeArrayRef(ContentStart,SectionSize);
+ llvm_unreachable("Not yet implemented!");
}
uint64_t XCOFFObjectFile::getSectionAlignment(DataRefImpl Sec) const {
@@ -309,8 +247,9 @@ bool XCOFFObjectFile::isSectionBSS(DataRefImpl Sec) const {
}
bool XCOFFObjectFile::isSectionVirtual(DataRefImpl Sec) const {
- return is64Bit() ? toSection64(Sec)->FileOffsetToRawData == 0
- : toSection32(Sec)->FileOffsetToRawData == 0;
+ bool Result = false;
+ llvm_unreachable("Not yet implemented!");
+ return Result;
}
relocation_iterator XCOFFObjectFile::section_rel_begin(DataRefImpl Sec) const {
@@ -396,6 +335,7 @@ Triple::ArchType XCOFFObjectFile::getArch() const {
}
SubtargetFeatures XCOFFObjectFile::getFeatures() const {
+ llvm_unreachable("Not yet implemented!");
return SubtargetFeatures();
}
@@ -453,8 +393,8 @@ XCOFFObjectFile::getSymbolSectionName(const XCOFFSymbolEntry *SymEntPtr) const {
default:
Expected<DataRefImpl> SecRef = getSectionByNum(SectionNum);
if (SecRef)
- return generateXCOFFFixedNameStringRef(
- getSectionNameInternal(SecRef.get()));
+ return generateStringRef(getSectionNameInternal(SecRef.get()),
+ XCOFF::SectionNameSize);
return SecRef.takeError();
}
}
@@ -502,48 +442,6 @@ uint32_t XCOFFObjectFile::getNumberOfSymbolTableEntries64() const {
return fileHeader64()->NumberOfSymTableEntries;
}
-uintptr_t XCOFFObjectFile::getEndOfSymbolTableAddress() const {
- uint32_t NumberOfSymTableEntries =
- is64Bit() ? getNumberOfSymbolTableEntries64()
- : getLogicalNumberOfSymbolTableEntries32();
- return getWithOffset(reinterpret_cast<uintptr_t>(SymbolTblPtr),
- XCOFF::SymbolTableEntrySize * NumberOfSymTableEntries);
-}
-
-void XCOFFObjectFile::checkSymbolEntryPointer(uintptr_t SymbolEntPtr) const {
- if (SymbolEntPtr < reinterpret_cast<uintptr_t>(SymbolTblPtr))
- report_fatal_error("Symbol table entry is outside of symbol table.");
-
- if (SymbolEntPtr >= getEndOfSymbolTableAddress())
- report_fatal_error("Symbol table entry is outside of symbol table.");
-
- ptrdiff_t Offset = reinterpret_cast<const char *>(SymbolEntPtr) -
- reinterpret_cast<const char *>(SymbolTblPtr);
-
- if (Offset % XCOFF::SymbolTableEntrySize != 0)
- report_fatal_error(
- "Symbol table entry position is not valid inside of symbol table.");
-}
-
-uint32_t XCOFFObjectFile::getSymbolIndex(uintptr_t SymbolEntPtr) const {
- return (reinterpret_cast<const char *>(SymbolEntPtr) -
- reinterpret_cast<const char *>(SymbolTblPtr)) /
- XCOFF::SymbolTableEntrySize;
-}
-
-Expected<StringRef>
-XCOFFObjectFile::getSymbolNameByIndex(uint32_t Index) const {
- if (is64Bit())
- report_fatal_error("64-bit symbol table support not implemented yet.");
-
- if (Index >= getLogicalNumberOfSymbolTableEntries32())
- return errorCodeToError(object_error::invalid_symbol_index);
-
- DataRefImpl SymDRI;
- SymDRI.p = reinterpret_cast<uintptr_t>(getPointerToSymbolTable() + Index);
- return getSymbolName(SymDRI);
-}
-
uint16_t XCOFFObjectFile::getFlags() const {
return is64Bit() ? fileHeader64()->Flags : fileHeader32()->Flags;
}
@@ -579,46 +477,6 @@ ArrayRef<XCOFFSectionHeader32> XCOFFObjectFile::sections32() const {
TablePtr + getNumberOfSections());
}
-// In an XCOFF32 file, when the field value is 65535, then an STYP_OVRFLO
-// section header contains the actual count of relocation entries in the s_paddr
-// field. STYP_OVRFLO headers contain the section index of their corresponding
-// sections as their raw "NumberOfRelocations" field value.
-Expected<uint32_t> XCOFFObjectFile::getLogicalNumberOfRelocationEntries(
- const XCOFFSectionHeader32 &Sec) const {
-
- uint16_t SectionIndex = &Sec - sectionHeaderTable32() + 1;
-
- if (Sec.NumberOfRelocations < RELOC_OVERFLOW)
- return Sec.NumberOfRelocations;
- for (const auto &Sec : sections32()) {
- if (Sec.Flags == XCOFF::STYP_OVRFLO &&
- Sec.NumberOfRelocations == SectionIndex)
- return Sec.PhysicalAddress;
- }
- return errorCodeToError(object_error::parse_failed);
-}
-
-Expected<ArrayRef<XCOFFRelocation32>>
-XCOFFObjectFile::relocations(const XCOFFSectionHeader32 &Sec) const {
- uintptr_t RelocAddr = getWithOffset(reinterpret_cast<uintptr_t>(FileHeader),
- Sec.FileOffsetToRelocationInfo);
- auto NumRelocEntriesOrErr = getLogicalNumberOfRelocationEntries(Sec);
- if (Error E = NumRelocEntriesOrErr.takeError())
- return std::move(E);
-
- uint32_t NumRelocEntries = NumRelocEntriesOrErr.get();
-
- auto RelocationOrErr =
- getObject<XCOFFRelocation32>(Data, reinterpret_cast<void *>(RelocAddr),
- NumRelocEntries * sizeof(XCOFFRelocation32));
- if (Error E = RelocationOrErr.takeError())
- return std::move(E);
-
- const XCOFFRelocation32 *StartReloc = RelocationOrErr.get();
-
- return ArrayRef<XCOFFRelocation32>(StartReloc, StartReloc + NumRelocEntries);
-}
-
Expected<XCOFFStringTable>
XCOFFObjectFile::parseStringTable(const XCOFFObjectFile *Obj, uint64_t Offset) {
// If there is a string table, then the buffer must contain at least 4 bytes
@@ -649,7 +507,7 @@ XCOFFObjectFile::parseStringTable(const XCOFFObjectFile *Obj, uint64_t Offset) {
Expected<std::unique_ptr<XCOFFObjectFile>>
XCOFFObjectFile::create(unsigned Type, MemoryBufferRef MBR) {
- // Can't use std::make_unique because of the private constructor.
+ // Can't use make_unique because of the private constructor.
std::unique_ptr<XCOFFObjectFile> Obj;
Obj.reset(new XCOFFObjectFile(Type, MBR));
@@ -714,75 +572,13 @@ ObjectFile::createXCOFFObjectFile(MemoryBufferRef MemBufRef,
return XCOFFObjectFile::create(FileType, MemBufRef);
}
-XCOFF::StorageClass XCOFFSymbolRef::getStorageClass() const {
- return OwningObjectPtr->toSymbolEntry(SymEntDataRef)->StorageClass;
-}
-
-uint8_t XCOFFSymbolRef::getNumberOfAuxEntries() const {
- return OwningObjectPtr->toSymbolEntry(SymEntDataRef)->NumberOfAuxEntries;
-}
-
-const XCOFFCsectAuxEnt32 *XCOFFSymbolRef::getXCOFFCsectAuxEnt32() const {
- assert(!OwningObjectPtr->is64Bit() &&
- "32-bit interface called on 64-bit object file.");
- assert(hasCsectAuxEnt() && "No Csect Auxiliary Entry is found.");
-
- // In XCOFF32, the csect auxilliary entry is always the last auxiliary
- // entry for the symbol.
- uintptr_t AuxAddr = getWithOffset(
- SymEntDataRef.p, XCOFF::SymbolTableEntrySize * getNumberOfAuxEntries());
-
-#ifndef NDEBUG
- OwningObjectPtr->checkSymbolEntryPointer(AuxAddr);
-#endif
-
- return reinterpret_cast<const XCOFFCsectAuxEnt32 *>(AuxAddr);
-}
-
-uint16_t XCOFFSymbolRef::getType() const {
- return OwningObjectPtr->toSymbolEntry(SymEntDataRef)->SymbolType;
-}
-
-int16_t XCOFFSymbolRef::getSectionNumber() const {
- return OwningObjectPtr->toSymbolEntry(SymEntDataRef)->SectionNumber;
+StringRef XCOFFSectionHeader32::getName() const {
+ return generateStringRef(Name, XCOFF::SectionNameSize);
}
-bool XCOFFSymbolRef::hasCsectAuxEnt() const {
- XCOFF::StorageClass SC = getStorageClass();
- return (SC == XCOFF::C_EXT || SC == XCOFF::C_WEAKEXT ||
- SC == XCOFF::C_HIDEXT);
-}
-
-bool XCOFFSymbolRef::isFunction() const {
- if (OwningObjectPtr->is64Bit())
- report_fatal_error("64-bit support is unimplemented yet.");
-
- if (getType() & FUNCTION_SYM)
- return true;
-
- if (!hasCsectAuxEnt())
- return false;
-
- const XCOFFCsectAuxEnt32 *CsectAuxEnt = getXCOFFCsectAuxEnt32();
-
- // A function definition should be a label definition.
- if ((CsectAuxEnt->SymbolAlignmentAndType & SYM_TYPE_MASK) != XCOFF::XTY_LD)
- return false;
-
- if (CsectAuxEnt->StorageMappingClass != XCOFF::XMC_PR)
- return false;
-
- int16_t SectNum = getSectionNumber();
- Expected<DataRefImpl> SI = OwningObjectPtr->getSectionByNum(SectNum);
- if (!SI)
- return false;
-
- return (OwningObjectPtr->getSectionFlags(SI.get()) & XCOFF::STYP_TEXT);
+StringRef XCOFFSectionHeader64::getName() const {
+ return generateStringRef(Name, XCOFF::SectionNameSize);
}
-// Explictly instantiate template classes.
-template struct XCOFFSectionHeader<XCOFFSectionHeader32>;
-template struct XCOFFSectionHeader<XCOFFSectionHeader64>;
-
} // namespace object
} // namespace llvm