summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/MC/WinCOFFObjectWriter.cpp22
-rw-r--r--llvm/test/MC/COFF/weak-alias-local.s2
-rw-r--r--llvm/test/MC/COFF/weak-val.s2
-rw-r--r--llvm/test/MC/COFF/weak.s4
4 files changed, 17 insertions, 13 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index 749ed8badfa..d314533a574 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -352,9 +352,10 @@ COFFSymbol *WinCOFFObjectWriter::getLinkedSymbol(const MCSymbol &Symbol) {
/// This function takes a symbol data object from the assembler
/// and creates the associated COFF symbol staging object.
-void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &MCSym,
+void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &MCSymGeneric,
MCAssembler &Assembler,
const MCAsmLayout &Layout) {
+ const auto &MCSym = cast<MCSymbolCOFF>(MCSymGeneric);
COFFSymbol *Sym = GetOrCreateCOFFSymbol(&MCSym);
const MCSymbol *Base = Layout.getBaseSymbol(MCSym);
COFFSection *Sec = nullptr;
@@ -365,7 +366,7 @@ void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &MCSym,
}
COFFSymbol *Local = nullptr;
- if (cast<MCSymbolCOFF>(MCSym).isWeakExternal()) {
+ if (MCSym.isWeakExternal()) {
Sym->Data.StorageClass = COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL;
COFFSymbol *WeakDefault = getLinkedSymbol(MCSym);
@@ -376,6 +377,9 @@ void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &MCSym,
WeakDefault->Data.SectionNumber = COFF::IMAGE_SYM_ABSOLUTE;
else
WeakDefault->Section = Sec;
+ // Make the default symbol static, in order to not conflict with
+ // similar default symbols for the same weak in other objects.
+ WeakDefault->Data.StorageClass = COFF::IMAGE_SYM_CLASS_STATIC;
Local = WeakDefault;
}
@@ -394,14 +398,8 @@ void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &MCSym,
else
Sym->Section = Sec;
Local = Sym;
- }
- if (Local) {
- Local->Data.Value = getSymbolValue(MCSym, Layout);
-
- const MCSymbolCOFF &SymbolCOFF = cast<MCSymbolCOFF>(MCSym);
- Local->Data.Type = SymbolCOFF.getType();
- Local->Data.StorageClass = SymbolCOFF.getClass();
+ Local->Data.StorageClass = MCSym.getClass();
// If no storage class was specified in the streamer, define it here.
if (Local->Data.StorageClass == COFF::IMAGE_SYM_CLASS_NULL) {
@@ -413,6 +411,12 @@ void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &MCSym,
}
}
+ if (Local) {
+ Local->Data.Value = getSymbolValue(MCSym, Layout);
+
+ Local->Data.Type = MCSym.getType();
+ }
+
Sym->MC = &MCSym;
}
diff --git a/llvm/test/MC/COFF/weak-alias-local.s b/llvm/test/MC/COFF/weak-alias-local.s
index 93a3652428e..455f921e78b 100644
--- a/llvm/test/MC/COFF/weak-alias-local.s
+++ b/llvm/test/MC/COFF/weak-alias-local.s
@@ -38,6 +38,6 @@ a=b
// CHECK-NEXT: Section: .data (2)
// CHECK-NEXT: BaseType: Null (0x0)
// CHECK-NEXT: ComplexType: Null (0x0)
-// CHECK-NEXT: StorageClass: External (0x2)
+// CHECK-NEXT: StorageClass: Static (0x3)
// CHECK-NEXT: AuxSymbolCount: 0
// CHECK-NEXT: }
diff --git a/llvm/test/MC/COFF/weak-val.s b/llvm/test/MC/COFF/weak-val.s
index cb5872b057e..7c7b9dbbb83 100644
--- a/llvm/test/MC/COFF/weak-val.s
+++ b/llvm/test/MC/COFF/weak-val.s
@@ -28,6 +28,6 @@ b:
// CHECK-NEXT: Section: .data (2)
// CHECK-NEXT: BaseType: Null (0x0)
// CHECK-NEXT: ComplexType: Null (0x0)
-// CHECK-NEXT: StorageClass: External (0x2)
+// CHECK-NEXT: StorageClass: Static (0x3)
// CHECK-NEXT: AuxSymbolCount: 0
// CHECK-NEXT: }
diff --git a/llvm/test/MC/COFF/weak.s b/llvm/test/MC/COFF/weak.s
index 5e216cef2cb..87bf26d4d88 100644
--- a/llvm/test/MC/COFF/weak.s
+++ b/llvm/test/MC/COFF/weak.s
@@ -64,7 +64,7 @@ LBB0_2: # %return
// CHECK-NEXT: Section: IMAGE_SYM_ABSOLUTE (-1)
// CHECK-NEXT: BaseType: Null
// CHECK-NEXT: ComplexType: Null
-// CHECK-NEXT: StorageClass: External
+// CHECK-NEXT: StorageClass: Static
// CHECK-NEXT: AuxSymbolCount: 0
// CHECK-NEXT: }
@@ -88,6 +88,6 @@ LBB0_2: # %return
// CHECK-NEXT: Section: .text
// CHECK-NEXT: BaseType: Null
// CHECK-NEXT: ComplexType: Null
-// CHECK-NEXT: StorageClass: External
+// CHECK-NEXT: StorageClass: Static
// CHECK-NEXT: AuxSymbolCount: 0
// CHECK-NEXT: }
OpenPOWER on IntegriCloud