summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Symbols.h2
-rw-r--r--lld/COFF/Writer.cpp8
-rw-r--r--lld/test/COFF/secrel-common.s41
3 files changed, 51 insertions, 0 deletions
diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h
index feebb6dde1f..8c1390c4587 100644
--- a/lld/COFF/Symbols.h
+++ b/lld/COFF/Symbols.h
@@ -187,6 +187,8 @@ public:
}
uint64_t getRVA() { return Data->getRVA(); }
+ uint32_t getSecrel() { return Data->OutputSectionOff; }
+ uint16_t getSectionIndex();
private:
friend SymbolTable;
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 03e5d4d675b..d32577b361f 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -215,6 +215,8 @@ uint32_t Defined::getSecrel() {
switch (kind()) {
case DefinedRegularKind:
return cast<DefinedRegular>(this)->getSecrel();
+ case DefinedCommonKind:
+ return cast<DefinedCommon>(this)->getSecrel();
case DefinedSyntheticKind:
return cast<DefinedSynthetic>(this)->getSecrel();
default:
@@ -235,6 +237,8 @@ uint16_t Defined::getSectionIndex() {
return D->getChunk()->getOutputSection()->SectionIndex;
if (isa<DefinedAbsolute>(this))
return DefinedAbsolute::OutputSectionIndex;
+ if (auto *D = dyn_cast<DefinedCommon>(this))
+ return D->getSectionIndex();
if (auto *D = dyn_cast<DefinedSynthetic>(this)) {
if (!D->getChunk())
return 0;
@@ -244,6 +248,10 @@ uint16_t Defined::getSectionIndex() {
toString(*this));
}
+uint16_t DefinedCommon::getSectionIndex() {
+ return Data->getOutputSection()->SectionIndex;
+}
+
bool Defined::isExecutable() {
const auto X = IMAGE_SCN_MEM_EXECUTE;
if (auto *D = dyn_cast<DefinedRegular>(this))
diff --git a/lld/test/COFF/secrel-common.s b/lld/test/COFF/secrel-common.s
new file mode 100644
index 00000000000..0188f6cb967
--- /dev/null
+++ b/lld/test/COFF/secrel-common.s
@@ -0,0 +1,41 @@
+# RUN: llvm-mc %s -filetype=obj -triple=x86_64-windows-msvc -o %t.obj
+# RUN: lld-link -entry:main -nodefaultlib %t.obj -out:%t.exe
+# RUN: llvm-readobj %t.exe -sections -section-data | FileCheck %s
+
+# Section relocations against common symbols resolve to .bss.
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK: Number: 1
+# CHECK: Name: .bss (2E 62 73 73 00 00 00 00)
+# CHECK: VirtualSize: 0x4
+# CHECK: }
+# CHECK: Section {
+# CHECK: Number: 2
+# CHECK: Name: .rdata (2E 72 64 61 74 61 00 00)
+# CHECK: SectionData (
+# CHECK: 0000: 00000000 01000000 |........|
+# CHECK: )
+# CHECK: }
+# CHECK: Section {
+# CHECK: Number: 3
+# CHECK: Name: .text (2E 74 65 78 74 00 00 00)
+# CHECK: VirtualSize: 0x1
+# CHECK: SectionData (
+# CHECK: 0000: C3 |.|
+# CHECK: )
+# CHECK: }
+# CHECK-NOT: Section
+# CHECK: ]
+
+.text
+.global main
+main:
+ret
+
+.comm common_global,4,2
+
+.section .rdata,"dr"
+.secrel32 common_global
+.secidx common_global
+.short 0
OpenPOWER on IntegriCloud