Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld/COFF
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-06-26 06:09:23 +0300
committerRui Ueyama <ruiu@google.com>2015-06-26 06:09:23 +0300
commitccde19d77ec8e990bedeea2a7190beb3f42cce06 (patch)
treeac3d1ca3bcd217409d22f388b3df8f03e943cf0a /lld/COFF
parent2cd34bb5857b74561277cc146a2558c2fb93e91c (diff)
COFF: Fix local absolute symbols.
Absolute symbols were always handled as external symbols, so if two or more object files define the same absolute symbol, they would conflict even if the symbol is private to each file. This patch fixes that bug. llvm-svn: 240756
Diffstat (limited to 'lld/COFF')
-rw-r--r--lld/COFF/InputFiles.cpp2
-rw-r--r--lld/COFF/Symbols.h14
2 files changed, 11 insertions, 5 deletions
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index f616d4ceb2db..c54ccddef65b 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -198,7 +198,7 @@ SymbolBody *ObjectFile::createSymbolBody(COFFSymbolRef Sym, const void *AuxP,
// Skip special symbols.
if (Name == "@comp.id" || Name == "@feat.00")
return nullptr;
- return new (Alloc) DefinedAbsolute(Name, Sym.getValue());
+ return new (Alloc) DefinedAbsolute(Name, Sym);
}
if (Sym.getSectionNumber() == llvm::COFF::IMAGE_SYM_DEBUG)
return nullptr;
diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h
index 7262f9a884bd..8afbdc6d5b85 100644
--- a/lld/COFF/Symbols.h
+++ b/lld/COFF/Symbols.h
@@ -173,20 +173,26 @@ private:
// Absolute symbols.
class DefinedAbsolute : public Defined {
public:
- DefinedAbsolute(StringRef N, uint64_t VA)
- : Defined(DefinedAbsoluteKind), Name(N), RVA(VA - Config->ImageBase) {}
+ DefinedAbsolute(StringRef N, COFFSymbolRef S)
+ : Defined(DefinedAbsoluteKind), Name(N), VA(S.getValue()),
+ External(S.isExternal()) {}
+
+ DefinedAbsolute(StringRef N, uint64_t V)
+ : Defined(DefinedAbsoluteKind), Name(N), VA(V) {}
static bool classof(const SymbolBody *S) {
return S->kind() == DefinedAbsoluteKind;
}
StringRef getName() override { return Name; }
- uint64_t getRVA() override { return RVA; }
+ uint64_t getRVA() override { return VA - Config->ImageBase; }
uint64_t getFileOff() override { llvm_unreachable("internal error"); }
+ bool isExternal() override { return External; }
private:
StringRef Name;
- uint64_t RVA;
+ uint64_t VA;
+ bool External = true;
};
// This class represents a symbol defined in an archive file. It is