File tree 2 files changed +13
-24
lines changed
2 files changed +13
-24
lines changed Original file line number Diff line number Diff line change @@ -1190,14 +1190,12 @@ void WinCOFFObjectWriter::reset() {
1190
1190
bool WinCOFFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl (
1191
1191
const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB,
1192
1192
bool InSet, bool IsPCRel) const {
1193
- // Don't drop relocations between functions, even if they are in the same text
1194
- // section. Multiple Visual C++ linker features depend on having the
1195
- // relocations present. The /INCREMENTAL flag will cause these relocations to
1196
- // point to thunks, and the /GUARD:CF flag assumes that it can use relocations
1197
- // to approximate the set of all address taken functions. LLD's implementation
1198
- // of /GUARD:CF also relies on the existance of these relocations.
1193
+ // MS LINK expects to be able to replace all references to a function with a
1194
+ // thunk to implement their /INCREMENTAL feature. Make sure we don't optimize
1195
+ // away any relocations to functions.
1199
1196
uint16_t Type = cast<MCSymbolCOFF>(SymA).getType ();
1200
- if ((Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
1197
+ if (Asm.isIncrementalLinkerCompatible () &&
1198
+ (Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
1201
1199
return false ;
1202
1200
return MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl (Asm, SymA, FB,
1203
1201
InSet, IsPCRel);
Original file line number Diff line number Diff line change 1
1
// RUN: llvm - mc - filetype=obj - triple i686 - pc - mingw32 %s | llvm - readobj - S -- sr -- sd - | FileCheck %s
2
2
3
- // COFF resolves differences between labels in the same section , unless th at
4
- // label is declared with function type.
5
-
6
3
. section baz , "xr"
4
+ .def X
5
+ .scl 2 ;
6
+ .type 32 ;
7
+ .endef
7
8
.globl X
8
9
X:
9
10
mov Y - X + 42 , % eax
10
11
retl
11
12
13
+ .def Y
14
+ .scl 2 ;
15
+ .type 32 ;
16
+ .endef
12
17
.globl Y
13
18
Y:
14
19
retl
@@ -25,11 +30,6 @@ _foobar: # @foobar
25
30
# %bb. 0 :
26
31
ret
27
32
28
- .globl _baz
29
- _baz:
30
- calll _foobar
31
- retl
32
-
33
33
.data
34
34
.globl _rust_crate # @rust_crate
35
35
. align 4
@@ -39,15 +39,6 @@ _rust_crate:
39
39
.long _foobar - _rust_crate
40
40
.long _foobar - _rust_crate
41
41
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
-
51
42
// CHECK: Name: .data
52
43
// CHECK: Relocations [
53
44
// CHECK - NEXT: 0x4 IMAGE_REL_I386_DIR32 _foobar
You can’t perform that action at this time.
0 commit comments