diff options
Diffstat (limited to 'lib/Object')
| -rw-r--r-- | lib/Object/ELF.cpp | 1 | ||||
| -rw-r--r-- | lib/Object/WasmObjectFile.cpp | 29 | ||||
| -rw-r--r-- | lib/Object/WindowsResource.cpp | 6 | 
3 files changed, 23 insertions, 13 deletions
| diff --git a/lib/Object/ELF.cpp b/lib/Object/ELF.cpp index c72a1258c1eef..5906dc5f5307b 100644 --- a/lib/Object/ELF.cpp +++ b/lib/Object/ELF.cpp @@ -138,6 +138,7 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,      default:        break;      } +    break;    case ELF::EM_BPF:      switch (Type) {  #include "llvm/BinaryFormat/ELFRelocs/BPF.def" diff --git a/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index 7a0c05ed8a152..48f98df6f34dc 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/lib/Object/WasmObjectFile.cpp @@ -303,7 +303,6 @@ Error WasmObjectFile::parseNameSection(const uint8_t *Ptr, const uint8_t *End) {  void WasmObjectFile::populateSymbolTable() {    // Add imports to symbol table -  size_t ImportIndex = 0;    size_t GlobalIndex = 0;    size_t FunctionIndex = 0;    for (const wasm::WasmImport& Import : Imports) { @@ -312,7 +311,7 @@ void WasmObjectFile::populateSymbolTable() {        assert(Import.Global.Type == wasm::WASM_TYPE_I32);        SymbolMap.try_emplace(Import.Field, Symbols.size());        Symbols.emplace_back(Import.Field, WasmSymbol::SymbolType::GLOBAL_IMPORT, -                           ImportSection, GlobalIndex++, ImportIndex); +                           ImportSection, GlobalIndex++);        DEBUG(dbgs() << "Adding import: " << Symbols.back()                     << " sym index:" << Symbols.size() << "\n");        break; @@ -320,14 +319,13 @@ void WasmObjectFile::populateSymbolTable() {        SymbolMap.try_emplace(Import.Field, Symbols.size());        Symbols.emplace_back(Import.Field,                             WasmSymbol::SymbolType::FUNCTION_IMPORT, -                           ImportSection, FunctionIndex++, ImportIndex); +                           ImportSection, FunctionIndex++, Import.SigIndex);        DEBUG(dbgs() << "Adding import: " << Symbols.back()                     << " sym index:" << Symbols.size() << "\n");        break;      default:        break;      } -    ImportIndex++;    }    // Add exports to symbol table @@ -338,11 +336,22 @@ void WasmObjectFile::populateSymbolTable() {            Export.Kind == wasm::WASM_EXTERNAL_FUNCTION                ? WasmSymbol::SymbolType::FUNCTION_EXPORT                : WasmSymbol::SymbolType::GLOBAL_EXPORT; -      SymbolMap.try_emplace(Export.Name, Symbols.size()); -      Symbols.emplace_back(Export.Name, ExportType, -                           ExportSection, Export.Index); -      DEBUG(dbgs() << "Adding export: " << Symbols.back() -                   << " sym index:" << Symbols.size() << "\n"); +      auto Pair = SymbolMap.try_emplace(Export.Name, Symbols.size()); +      if (Pair.second) { +        Symbols.emplace_back(Export.Name, ExportType, +                             ExportSection, Export.Index); +        DEBUG(dbgs() << "Adding export: " << Symbols.back() +                     << " sym index:" << Symbols.size() << "\n"); +      } else { +        uint32_t SymIndex = Pair.first->second; +        const WasmSymbol &OldSym = Symbols[SymIndex]; +        WasmSymbol NewSym(Export.Name, ExportType, ExportSection, Export.Index); +        NewSym.setAltIndex(OldSym.ElementIndex); +        Symbols[SymIndex] = NewSym; + +        DEBUG(dbgs() << "Replacing existing symbol:  " << NewSym +                     << " sym index:" << SymIndex << "\n"); +      }      }    }  } @@ -1017,7 +1026,7 @@ void WasmObjectFile::getRelocationTypeName(      break;    switch (Rel.Type) { -#include "llvm/BinaryFormat/WasmRelocs/WebAssembly.def" +#include "llvm/BinaryFormat/WasmRelocs.def"    }  #undef WASM_RELOC diff --git a/lib/Object/WindowsResource.cpp b/lib/Object/WindowsResource.cpp index 9ca584a4a1ae1..271224ec63120 100644 --- a/lib/Object/WindowsResource.cpp +++ b/lib/Object/WindowsResource.cpp @@ -14,6 +14,7 @@  #include "llvm/Object/WindowsResource.h"  #include "llvm/Object/COFF.h"  #include "llvm/Support/FileOutputBuffer.h" +#include "llvm/Support/FormatVariadic.h"  #include "llvm/Support/MathExtras.h"  #include <ctime>  #include <queue> @@ -560,10 +561,9 @@ void WindowsResourceCOFFWriter::writeSymbolTable() {    // Now write a symbol for each relocation.    for (unsigned i = 0; i < Data.size(); i++) { -    char RelocationName[9]; -    sprintf(RelocationName, "$R%06X", DataOffsets[i]); +    auto RelocationName = formatv("$R{0:X-6}", i & 0xffffff).sstr<COFF::NameSize>();      Symbol = reinterpret_cast<coff_symbol16 *>(BufferStart + CurrentOffset); -    strncpy(Symbol->Name.ShortName, RelocationName, (size_t)COFF::NameSize); +    memcpy(Symbol->Name.ShortName, RelocationName.data(), (size_t) COFF::NameSize);      Symbol->Value = DataOffsets[i];      Symbol->SectionNumber = 2;      Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL; | 
