[lld] r242066 - COFF: Split createSymbolAndSymbolTable to small functions. NFC.
Rui Ueyama
ruiu at google.com
Mon Jul 13 13:56:31 PDT 2015
Author: ruiu
Date: Mon Jul 13 15:56:31 2015
New Revision: 242066
URL: http://llvm.org/viewvc/llvm-project?rev=242066&view=rev
Log:
COFF: Split createSymbolAndSymbolTable to small functions. NFC.
Modified:
lld/trunk/COFF/Writer.cpp
lld/trunk/COFF/Writer.h
Modified: lld/trunk/COFF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=242066&r1=242065&r2=242066&view=diff
==============================================================================
--- lld/trunk/COFF/Writer.cpp (original)
+++ lld/trunk/COFF/Writer.cpp Mon Jul 13 15:56:31 2015
@@ -291,6 +291,33 @@ size_t Writer::addEntryToStringTable(Str
return OffsetOfEntry;
}
+coff_symbol16 Writer::createSymbol(DefinedRegular *D) {
+ uint64_t RVA = D->getRVA();
+ OutputSection *Sec = nullptr;
+ for (OutputSection *S : OutputSections) {
+ if (S->getRVA() > RVA)
+ break;
+ Sec = S;
+ }
+
+ coff_symbol16 Sym;
+ StringRef Name = D->getName();
+ if (Name.size() > COFF::NameSize) {
+ Sym.Name.Offset.Zeroes = 0;
+ Sym.Name.Offset.Offset = addEntryToStringTable(Name);
+ } else {
+ memset(Sym.Name.ShortName, 0, COFF::NameSize);
+ memcpy(Sym.Name.ShortName, Name.data(), Name.size());
+ }
+ COFFSymbolRef DSymRef = D->getCOFFSymbol();
+ Sym.Value = RVA - Sec->getRVA();
+ Sym.SectionNumber = Sec->SectionIndex;
+ Sym.Type = DSymRef.getType();
+ Sym.StorageClass = DSymRef.getStorageClass();
+ Sym.NumberOfAuxSymbols = 0;
+ return Sym;
+}
+
void Writer::createSymbolAndStringTable() {
if (!Config->Debug)
return;
@@ -302,40 +329,13 @@ void Writer::createSymbolAndStringTable(
continue;
Sec->setStringTableOff(addEntryToStringTable(Name));
}
- for (ObjectFile *File : Symtab->ObjectFiles) {
- for (SymbolBody *B : File->getSymbols()) {
- auto *D = dyn_cast<DefinedRegular>(B);
- if (!D || !D->isLive())
- continue;
- uint64_t RVA = D->getRVA();
- OutputSection *SymSec = nullptr;
- for (OutputSection *Sec : OutputSections) {
- if (Sec->getRVA() > RVA)
- break;
- SymSec = Sec;
- }
- uint64_t SectionRVA = SymSec->getRVA();
- uint64_t SymbolValue = RVA - SectionRVA;
- StringRef Name = D->getName();
- coff_symbol16 Sym;
- if (Name.size() > COFF::NameSize) {
- Sym.Name.Offset.Zeroes = 0;
- Sym.Name.Offset.Offset = addEntryToStringTable(Name);
- } else {
- memset(Sym.Name.ShortName, 0, COFF::NameSize);
- memcpy(Sym.Name.ShortName, Name.data(), Name.size());
- }
+ for (ObjectFile *File : Symtab->ObjectFiles)
+ for (SymbolBody *B : File->getSymbols())
+ if (auto *D = dyn_cast<DefinedRegular>(B))
+ if (D->isLive())
+ OutputSymtab.push_back(createSymbol(D));
- COFFSymbolRef DSymRef= D->getCOFFSymbol();
- Sym.Value = SymbolValue;
- Sym.SectionNumber = SymSec->SectionIndex;
- Sym.Type = DSymRef.getType();
- Sym.StorageClass = DSymRef.getStorageClass();
- Sym.NumberOfAuxSymbols = 0;
- OutputSymtab.push_back(Sym);
- }
- }
OutputSection *LastSection = OutputSections.back();
// We position the symbol table to be adjacent to the end of the last section.
uint64_t FileOff =
Modified: lld/trunk/COFF/Writer.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.h?rev=242066&r1=242065&r2=242066&view=diff
==============================================================================
--- lld/trunk/COFF/Writer.h (original)
+++ lld/trunk/COFF/Writer.h Mon Jul 13 15:56:31 2015
@@ -87,13 +87,15 @@ private:
void assignAddresses();
void removeEmptySections();
void createSymbolAndStringTable();
- size_t addEntryToStringTable(StringRef Str);
std::error_code openFile(StringRef OutputPath);
template <typename PEHeaderTy> void writeHeader();
void writeSections();
void sortExceptionTable();
void applyRelocations();
+ coff_symbol16 createSymbol(DefinedRegular *D);
+ size_t addEntryToStringTable(StringRef Str);
+
OutputSection *findSection(StringRef Name);
OutputSection *createSection(StringRef Name);
void addBaserels(OutputSection *Dest);
More information about the llvm-commits
mailing list