[lld] r263918 - [COFF] Remove undefined behavior from ObjectFile::createWeakExternal
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 20 15:56:34 PDT 2016
Author: majnemer
Date: Sun Mar 20 17:56:31 2016
New Revision: 263918
URL: http://llvm.org/viewvc/llvm-project?rev=263918&view=rev
Log:
[COFF] Remove undefined behavior from ObjectFile::createWeakExternal
LLD type-punned an integral type and a pointer type using a pointer
field. This is problematic because the pointer type has alignment
greater than some of the integral values.
This would be less problematic if a union was used but it turns out the
integral values are only present for a short, transient, amount of time.
Let's remove this undefined behavior by skipping the punning altogether
by storing the state in a separate memory location: a vector which
informs us which symbols to process for weak externs.
Modified:
lld/trunk/COFF/InputFiles.cpp
lld/trunk/COFF/InputFiles.h
Modified: lld/trunk/COFF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=263918&r1=263917&r2=263918&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.cpp (original)
+++ lld/trunk/COFF/InputFiles.cpp Sun Mar 20 17:56:31 2016
@@ -149,7 +149,7 @@ void ObjectFile::initializeSymbols() {
uint32_t NumSymbols = COFFObj->getNumberOfSymbols();
SymbolBodies.reserve(NumSymbols);
SparseSymbolBodies.resize(NumSymbols);
- llvm::SmallVector<Undefined *, 8> WeakAliases;
+ llvm::SmallVector<std::pair<Undefined *, uint32_t>, 8> WeakAliases;
int32_t LastSectionNumber = 0;
for (uint32_t I = 0; I < NumSymbols; ++I) {
// Get a COFFSymbolRef object.
@@ -167,8 +167,10 @@ void ObjectFile::initializeSymbols() {
if (Sym.isUndefined()) {
Body = createUndefined(Sym);
} else if (Sym.isWeakExternal()) {
- Body = createWeakExternal(Sym, AuxP);
- WeakAliases.push_back((Undefined *)Body);
+ Body = createUndefined(Sym);
+ uint32_t TagIndex =
+ static_cast<const coff_aux_weak_external *>(AuxP)->TagIndex;
+ WeakAliases.emplace_back((Undefined *)Body, TagIndex);
} else {
Body = createDefined(Sym, AuxP, IsFirst);
}
@@ -179,8 +181,8 @@ void ObjectFile::initializeSymbols() {
I += Sym.getNumberOfAuxSymbols();
LastSectionNumber = Sym.getSectionNumber();
}
- for (Undefined *U : WeakAliases)
- U->WeakAlias = SparseSymbolBodies[(uintptr_t)U->WeakAlias];
+ for (auto WeakAlias : WeakAliases)
+ WeakAlias.first->WeakAlias = SparseSymbolBodies[WeakAlias.second];
}
Undefined *ObjectFile::createUndefined(COFFSymbolRef Sym) {
@@ -189,15 +191,6 @@ Undefined *ObjectFile::createUndefined(C
return new (Alloc) Undefined(Name);
}
-Undefined *ObjectFile::createWeakExternal(COFFSymbolRef Sym, const void *AuxP) {
- StringRef Name;
- COFFObj->getSymbolName(Sym, Name);
- auto *U = new (Alloc) Undefined(Name);
- auto *Aux = (const coff_aux_weak_external *)AuxP;
- U->WeakAlias = (Undefined *)(uintptr_t)Aux->TagIndex;
- return U;
-}
-
Defined *ObjectFile::createDefined(COFFSymbolRef Sym, const void *AuxP,
bool IsFirst) {
StringRef Name;
Modified: lld/trunk/COFF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.h?rev=263918&r1=263917&r2=263918&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.h (original)
+++ lld/trunk/COFF/InputFiles.h Sun Mar 20 17:56:31 2016
@@ -147,7 +147,6 @@ private:
Defined *createDefined(COFFSymbolRef Sym, const void *Aux, bool IsFirst);
Undefined *createUndefined(COFFSymbolRef Sym);
- Undefined *createWeakExternal(COFFSymbolRef Sym, const void *Aux);
std::unique_ptr<COFFObjectFile> COFFObj;
llvm::BumpPtrAllocator Alloc;
More information about the llvm-commits
mailing list