File tree Expand file tree Collapse file tree 2 files changed +13
-24
lines changed Expand file tree Collapse file tree 2 files changed +13
-24
lines changed Original file line number Diff line number Diff line change @@ -698,14 +698,12 @@ void WinCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
698698bool WinCOFFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl (
699699 const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB,
700700 bool InSet, bool IsPCRel) const {
701- // Don't drop relocations between functions, even if they are in the same text
702- // section. Multiple Visual C++ linker features depend on having the
703- // relocations present. The /INCREMENTAL flag will cause these relocations to
704- // point to thunks, and the /GUARD:CF flag assumes that it can use relocations
705- // to approximate the set of all address taken functions. LLD's implementation
706- // of /GUARD:CF also relies on the existance of these relocations.
701+ // MS LINK expects to be able to replace all references to a function with a
702+ // thunk to implement their /INCREMENTAL feature. Make sure we don't optimize
703+ // away any relocations to functions.
707704 uint16_t Type = cast<MCSymbolCOFF>(SymA).getType ();
708- if ((Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
705+ if (Asm.isIncrementalLinkerCompatible () &&
706+ (Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
709707 return false ;
710708 return MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl (Asm, SymA, FB,
711709 InSet, IsPCRel);
Original file line number Diff line number Diff line change 11// RUN: llvm - mc - filetype=obj - triple i686 - pc - mingw32 %s | llvm - readobj - S -- sr -- sd - | FileCheck %s
22
3- // COFF resolves differences between labels in the same section , unless th at
4- // label is declared with function type.
5-
63. section baz , "xr"
4+ .def X
5+ .scl 2 ;
6+ .type 32 ;
7+ .endef
78 .globl X
89X:
910 mov Y - X + 42 , % eax
1011 retl
1112
13+ .def Y
14+ .scl 2 ;
15+ .type 32 ;
16+ .endef
1217 .globl Y
1318Y:
1419 retl
@@ -25,11 +30,6 @@ _foobar: # @foobar
2530# %bb. 0 :
2631 ret
2732
28- .globl _baz
29- _baz:
30- calll _foobar
31- retl
32-
3333 .data
3434 .globl _rust_crate # @rust_crate
3535 . align 4
@@ -39,15 +39,6 @@ _rust_crate:
3939 .long _foobar - _rust_crate
4040 .long _foobar - _rust_crate
4141
42- // Even though _baz and _foobar are in the same .text section , we keep the
43- // relocation for compatibility with the VC linker's /guard:cf and /incremental
44- // flags , even on mingw.
45-
46- // CHECK: Name: .text
47- // CHECK: Relocations [
48- // CHECK - NEXT: 0x12 IMAGE_REL_I386_REL32 _foobar
49- // CHECK - NEXT: ]
50-
5142// CHECK: Name: .data
5243// CHECK: Relocations [
5344// CHECK - NEXT: 0x4 IMAGE_REL_I386_DIR32 _foobar
You can’t perform that action at this time.
0 commit comments