[PATCH] D143538: [Object 3/5] Don't insert string table into object members vector.

Jacek Caban via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 7 16:46:47 PST 2023


jacek created this revision.
Herald added subscribers: hiraditya, kristof.beyls.
Herald added a project: All.
jacek requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D143538

Files:
  llvm/lib/Object/ArchiveWriter.cpp


Index: llvm/lib/Object/ArchiveWriter.cpp
===================================================================
--- llvm/lib/Object/ArchiveWriter.cpp
+++ llvm/lib/Object/ArchiveWriter.cpp
@@ -398,7 +398,8 @@
   }
 }
 
-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 =
@@ -413,7 +414,7 @@
 
   uint64_t Size = sizeof("!<arch>\n") - 1;
   Size += HeaderSize + SymtabSize;
-  return Size;
+  return Size + StringMemberSize;
 }
 
 static void writeSymbolTable(raw_ostream &Out, object::Archive::Kind Kind,
@@ -692,8 +693,14 @@
     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 =
@@ -714,7 +721,8 @@
   // 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
@@ -750,10 +758,16 @@
   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 {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143538.495681.patch
Type: text/x-patch
Size: 2716 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230208/7b8c214d/attachment.bin>


More information about the llvm-commits mailing list