}
bool WinCOFFObjectWriter::isWeak(const MCSymbolData &SD) const {
- // FIXME: this is for PR23025. Write a good description on
- // why this is needed.
- return SD.isExternal();
+ if (!SD.isExternal())
+ return false;
+
+ const MCSymbol &Sym = SD.getSymbol();
+ if (!Sym.isInSection())
+ return false;
+
+ const auto &Sec = cast<MCSectionCOFF>(Sym.getSection());
+ if (!Sec.getCOMDATSymbol())
+ return false;
+
+ // It looks like for COFF it is invalid to replace a reference to a global
+ // in a comdat with a reference to a local.
+ // FIXME: Add a specification reference if available.
+ return true;
}
void WinCOFFObjectWriter::RecordRelocation(
assert(Target.getSymA() && "Relocation must reference a symbol!");
const MCSymbol &Symbol = Target.getSymA()->getSymbol();
- const MCSymbol &A = Symbol.AliasedSymbol();
+ const MCSymbol &A = Symbol;
if (!Asm.hasSymbolData(A))
Asm.getContext().FatalError(
Fixup.getLoc(),
// CHECK: Relocations [
// CHECK-NEXT: Section {{.*}} .text {
// CHECK-NEXT: 0x3 IMAGE_REL_AMD64_REL32 zed
+// CHECK-NEXT: 0xA IMAGE_REL_AMD64_REL32 zed2
// CHECK-NEXT: }
// CHECK-NEXT: ]
foo:
leaq zed(%rip), %rax
+ leaq zed2(%rip), %rax
retq
.section .rdata,"dr",discard,zed
.globl zed
zed = Lbar+1
+
+ .globl zed2
+zed2 = Lbar