[lld] r319244 - COFF: Simplify construction of safe SEH table. NFCI.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 28 14:50:53 PST 2017


Author: pcc
Date: Tue Nov 28 14:50:53 2017
New Revision: 319244

URL: http://llvm.org/viewvc/llvm-project?rev=319244&view=rev
Log:
COFF: Simplify construction of safe SEH table. NFCI.

Instead of building intermediate sets of exception handlers for each
object file, just create one for the final output file.

Differential Revision: https://reviews.llvm.org/D40581

Modified:
    lld/trunk/COFF/InputFiles.cpp
    lld/trunk/COFF/InputFiles.h
    lld/trunk/COFF/Writer.cpp

Modified: lld/trunk/COFF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=319244&r1=319243&r2=319244&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.cpp (original)
+++ lld/trunk/COFF/InputFiles.cpp Tue Nov 28 14:50:53 2017
@@ -116,7 +116,6 @@ void ObjFile::parse() {
   // Read section and symbol tables.
   initializeChunks();
   initializeSymbols();
-  initializeSEH();
 }
 
 // We set SectionChunk pointers in the SparseChunks vector to this value
@@ -153,7 +152,12 @@ SectionChunk *ObjFile::readSection(uint3
     fatal("getSectionName failed: #" + Twine(SectionNumber) + ": " +
           EC.message());
   if (Name == ".sxdata") {
-    SXData = Sec;
+    ArrayRef<uint8_t> Data;
+    COFFObj->getSectionContents(Sec, Data);
+    if (Data.size() % 4 != 0)
+      fatal(".sxdata must be an array of symbol table indices");
+    SXData = {reinterpret_cast<const ulittle32_t *>(Data.data()),
+              Data.size() / 4};
     return nullptr;
   }
   if (Name == ".drectve") {
@@ -370,20 +374,6 @@ Optional<Symbol *> ObjFile::createDefine
   return createRegular(Sym);
 }
 
-void ObjFile::initializeSEH() {
-  if (!SEHCompat || !SXData)
-    return;
-  ArrayRef<uint8_t> A;
-  COFFObj->getSectionContents(SXData, A);
-  if (A.size() % 4 != 0)
-    fatal(".sxdata must be an array of symbol table indices");
-  auto *I = reinterpret_cast<const ulittle32_t *>(A.data());
-  auto *E = reinterpret_cast<const ulittle32_t *>(A.data() + A.size());
-  for (; I != E; ++I)
-    if (Symbols[*I])
-      SEHandlers.insert(Symbols[*I]);
-}
-
 MachineTypes ObjFile::getMachineType() {
   if (COFFObj)
     return static_cast<MachineTypes>(COFFObj->getMachine());

Modified: lld/trunk/COFF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.h?rev=319244&r1=319243&r2=319244&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.h (original)
+++ lld/trunk/COFF/InputFiles.h Tue Nov 28 14:50:53 2017
@@ -127,9 +127,9 @@ public:
   // COFF-specific and x86-only.
   bool SEHCompat = false;
 
-  // The list of safe exception handlers listed in .sxdata section.
+  // The symbol table indexes of the safe exception handlers.
   // COFF-specific and x86-only.
-  std::set<Symbol *> SEHandlers;
+  ArrayRef<llvm::support::ulittle32_t> SXData;
 
   // Pointer to the PDB module descriptor builder. Various debug info records
   // will reference object files by "module index", which is here. Things like
@@ -140,7 +140,6 @@ public:
 private:
   void initializeChunks();
   void initializeSymbols();
-  void initializeSEH();
 
   SectionChunk *
   readSection(uint32_t SectionNumber,
@@ -158,7 +157,6 @@ private:
   Symbol *createUndefined(COFFSymbolRef Sym);
 
   std::unique_ptr<COFFObjectFile> COFFObj;
-  const coff_section *SXData = nullptr;
 
   // List of all chunks defined by this file. This includes both section
   // chunks and non-section chunks for common symbols.

Modified: lld/trunk/COFF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=319244&r1=319243&r2=319244&view=diff
==============================================================================
--- lld/trunk/COFF/Writer.cpp (original)
+++ lld/trunk/COFF/Writer.cpp Tue Nov 28 14:50:53 2017
@@ -799,11 +799,10 @@ void Writer::createSEHTable(OutputSectio
   for (ObjFile *File : ObjFile::Instances) {
     if (!File->SEHCompat)
       return;
-    for (Symbol *B : File->SEHandlers) {
-      // Make sure the handler is still live.
-      if (B->isLive())
-        Handlers.insert(cast<Defined>(B));
-    }
+    for (uint32_t I : File->SXData)
+      if (Symbol *B = File->getSymbol(I))
+        if (B->isLive())
+          Handlers.insert(cast<Defined>(B));
   }
 
   if (Handlers.empty())




More information about the llvm-commits mailing list