File tree Expand file tree Collapse file tree 2 files changed +24
-13
lines changed Expand file tree Collapse file tree 2 files changed +24
-13
lines changed Original file line number Diff line number Diff line change @@ -1190,12 +1190,14 @@ 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
- // 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.
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.
1196
1199
uint16_t Type = cast<MCSymbolCOFF>(SymA).getType ();
1197
- if (Asm.isIncrementalLinkerCompatible () &&
1198
- (Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
1200
+ if ((Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
1199
1201
return false ;
1200
1202
return MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl (Asm, SymA, FB,
1201
1203
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
+
3
6
. section baz , "xr"
4
- .def X
5
- .scl 2 ;
6
- .type 32 ;
7
- .endef
8
7
.globl X
9
8
X:
10
9
mov Y - X + 42 , % eax
11
10
retl
12
11
13
- .def Y
14
- .scl 2 ;
15
- .type 32 ;
16
- .endef
17
12
.globl Y
18
13
Y:
19
14
retl
@@ -30,6 +25,11 @@ _foobar: # @foobar
30
25
# %bb. 0 :
31
26
ret
32
27
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,6 +39,15 @@ _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
+
42
51
// CHECK: Name: .data
43
52
// CHECK: Relocations [
44
53
// CHECK - NEXT: 0x4 IMAGE_REL_I386_DIR32 _foobar
You can’t perform that action at this time.
0 commit comments