aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/ArchiveWriter.cpp
diff options
context:
space:
mode:
authorJacek Caban <jacek@codeweavers.com>2023-03-23 13:19:53 +0200
committerMartin Storsjö <martin@martin.st>2023-03-23 13:43:21 +0200
commit257dc54be2d292acec2d6b609ebb0a4e424c9e30 (patch)
tree2161ac48b5a04a90d6715ddb796980a27dc36b4b /llvm/lib/Object/ArchiveWriter.cpp
parent67d828fb2c0168e1fe0f1caeba8fc7dc47b0c3ff (diff)
downloadllvm-257dc54be2d292acec2d6b609ebb0a4e424c9e30.zip
llvm-257dc54be2d292acec2d6b609ebb0a4e424c9e30.tar.gz
llvm-257dc54be2d292acec2d6b609ebb0a4e424c9e30.tar.bz2
[Object][NFC] Don't insert string table into object members vector.
Having string table in members vector does not fit later patches in this series. Symbol map needs to refer to objects' offsets, but string table should not be referenced. Also for ARM64EC, the new <ECSYMBOLS> table is inserted after string table. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D143538
Diffstat (limited to 'llvm/lib/Object/ArchiveWriter.cpp')
-rw-r--r--llvm/lib/Object/ArchiveWriter.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp
index e2c9741..cd0429a 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -398,7 +398,8 @@ static void writeSymbolTableHeader(raw_ostream &Out, object::Archive::Kind Kind,
}
}
-static uint64_t computeHeadersSize(object::Archive::Kind Kind, uint64_t NumSyms,
+static uint64_t computeHeadersSize(object::Archive::Kind Kind,
+ uint64_t StringMemberSize, uint64_t NumSyms,
uint64_t SymNamesSize) {
uint32_t OffsetSize = is64BitKind(Kind) ? 8 : 4;
uint64_t SymtabSize =
@@ -410,7 +411,7 @@ static uint64_t computeHeadersSize(object::Archive::Kind Kind, uint64_t NumSyms,
return TmpBuf.size();
};
- return strlen("!<arch>\n") + computeSymbolTableHeaderSize() + SymtabSize;
+ return strlen("!<arch>\n") + computeSymbolTableHeaderSize() + SymtabSize + StringMemberSize;
}
static void writeSymbolTable(raw_ostream &Out, object::Archive::Kind Kind,
@@ -689,8 +690,14 @@ static Error writeArchiveToStream(raw_ostream &Out,
return E;
std::vector<MemberData> &Data = *DataOrErr;
- if (!StringTableBuf.empty() && !isAIXBigArchive(Kind))
- Data.insert(Data.begin(), computeStringTable(StringTableBuf));
+ uint64_t StringTableSize = 0;
+ MemberData StringTableMember;
+ if (!StringTableBuf.empty() && !isAIXBigArchive(Kind)) {
+ StringTableMember = computeStringTable(StringTableBuf);
+ StringTableSize = StringTableMember.Header.size() +
+ StringTableMember.Data.size() +
+ StringTableMember.Padding.size();
+ }
// We would like to detect if we need to switch to a 64-bit symbol table.
uint64_t LastMemberEndOffset = 0;
@@ -710,7 +717,8 @@ static Error writeArchiveToStream(raw_ostream &Out,
// table is at the start of the archive file for other archive formats.
if (WriteSymtab && !is64BitKind(Kind)) {
// We assume 32-bit offsets to see if 32-bit symbols are possible or not.
- HeadersSize = computeHeadersSize(Kind, NumSyms, SymNamesBuf.size());
+ HeadersSize =
+ computeHeadersSize(Kind, StringTableSize, NumSyms, SymNamesBuf.size());
// The SYM64 format is used when an archive's member offsets are larger than
// 32-bits can hold. The need for this shift in format is detected by
@@ -746,10 +754,16 @@ static Error writeArchiveToStream(raw_ostream &Out,
if (!isAIXBigArchive(Kind)) {
if (WriteSymtab) {
if (!HeadersSize)
- HeadersSize = computeHeadersSize(Kind, NumSyms, SymNamesBuf.size());
+ HeadersSize = computeHeadersSize(Kind, StringTableSize, NumSyms,
+ SymNamesBuf.size());
writeSymbolTable(Out, Kind, Deterministic, Data, SymNamesBuf,
*HeadersSize);
}
+
+ if (StringTableSize)
+ Out << StringTableMember.Header << StringTableMember.Data
+ << StringTableMember.Padding;
+
for (const MemberData &M : Data)
Out << M.Header << M.Data << M.Padding;
} else {