Skip to content

Commit 198652a

Browse files
authored
[X86] Treat __start_*/__stop_* symbols as large (#79909)
Followup to #79884. The linker adds __start_foo/__stop_foo symbols pointing to the beginning/end of the foo section. These can be far away from text, so treat them as large symbols under the medium/large code models. Performance to access these is almost certainly not important.
1 parent 7f6d445 commit 198652a

File tree

2 files changed

+157
-37
lines changed

2 files changed

+157
-37
lines changed

llvm/lib/Target/TargetMachine.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,11 @@ bool TargetMachine::isLargeGlobalValue(const GlobalValue *GVal) const {
8585
getCodeModel() == CodeModel::Large) {
8686
if (!GV->getValueType()->isSized())
8787
return true;
88-
if (GV->isDeclaration() && GV->getName() == "__ehdr_start")
88+
// Linker defined start/stop symbols can point to arbitrary points in the
89+
// binary, so treat them as large.
90+
if (GV->isDeclaration() && (GV->getName() == "__ehdr_start" ||
91+
GV->getName().starts_with("__start_") ||
92+
GV->getName().starts_with("__stop_")))
8993
return true;
9094
const DataLayout &DL = GV->getParent()->getDataLayout();
9195
uint64_t Size = DL.getTypeSizeInBits(GV->getValueType()) / 8;

llvm/test/CodeGen/X86/code-model-elf.ll

Lines changed: 152 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ target triple = "x86_64--linux"
5858
@forced_small_data = dso_local global [10 x i32] zeroinitializer, code_model "small", align 16
5959
@forced_large_data = dso_local global [10 x i32] zeroinitializer, code_model "large", align 16
6060
@__ehdr_start = external dso_local global i8
61+
@__start_foo = external dso_local global i8
62+
@__stop_foo = external dso_local global i8
6163

6264
define dso_local ptr @lea_static_data() #0 {
6365
; SMALL-STATIC-LABEL: lea_static_data:
@@ -858,6 +860,120 @@ define dso_local ptr @lea_ehdr_start() #0 {
858860
ret ptr @__ehdr_start
859861
}
860862

863+
define dso_local ptr @lea_start_foo() #0 {
864+
; SMALL-STATIC-LABEL: lea_start_foo:
865+
; SMALL-STATIC: # %bb.0:
866+
; SMALL-STATIC-NEXT: movl $__start_foo, %eax
867+
; SMALL-STATIC-NEXT: retq
868+
;
869+
; MEDIUM-STATIC-LABEL: lea_start_foo:
870+
; MEDIUM-STATIC: # %bb.0:
871+
; MEDIUM-STATIC-NEXT: movabsq $__start_foo, %rax
872+
; MEDIUM-STATIC-NEXT: retq
873+
;
874+
; LARGE-STATIC-LABEL: lea_start_foo:
875+
; LARGE-STATIC: # %bb.0:
876+
; LARGE-STATIC-NEXT: movabsq $__start_foo, %rax
877+
; LARGE-STATIC-NEXT: retq
878+
;
879+
; SMALL-PIC-LABEL: lea_start_foo:
880+
; SMALL-PIC: # %bb.0:
881+
; SMALL-PIC-NEXT: leaq __start_foo(%rip), %rax
882+
; SMALL-PIC-NEXT: retq
883+
;
884+
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_start_foo:
885+
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
886+
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
887+
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $__start_foo@GOTOFF, %rax
888+
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
889+
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
890+
;
891+
; MEDIUM-PIC-LABEL: lea_start_foo:
892+
; MEDIUM-PIC: # %bb.0:
893+
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
894+
; MEDIUM-PIC-NEXT: movabsq $__start_foo@GOTOFF, %rax
895+
; MEDIUM-PIC-NEXT: addq %rcx, %rax
896+
; MEDIUM-PIC-NEXT: retq
897+
;
898+
; LARGE-PIC-LABEL: lea_start_foo:
899+
; LARGE-PIC: # %bb.0:
900+
; LARGE-PIC-NEXT: .L14$pb:
901+
; LARGE-PIC-NEXT: leaq .L14$pb(%rip), %rax
902+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L14$pb, %rcx
903+
; LARGE-PIC-NEXT: addq %rax, %rcx
904+
; LARGE-PIC-NEXT: movabsq $__start_foo@GOTOFF, %rax
905+
; LARGE-PIC-NEXT: addq %rcx, %rax
906+
; LARGE-PIC-NEXT: retq
907+
;
908+
; LARGE-SMALL-DATA-PIC-LABEL: lea_start_foo:
909+
; LARGE-SMALL-DATA-PIC: # %bb.0:
910+
; LARGE-SMALL-DATA-PIC-NEXT: .L14$pb:
911+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L14$pb(%rip), %rax
912+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L14$pb, %rcx
913+
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
914+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $__start_foo@GOTOFF, %rax
915+
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
916+
; LARGE-SMALL-DATA-PIC-NEXT: retq
917+
ret ptr @__start_foo
918+
}
919+
920+
define dso_local ptr @lea_stop_foo() #0 {
921+
; SMALL-STATIC-LABEL: lea_stop_foo:
922+
; SMALL-STATIC: # %bb.0:
923+
; SMALL-STATIC-NEXT: movl $__stop_foo, %eax
924+
; SMALL-STATIC-NEXT: retq
925+
;
926+
; MEDIUM-STATIC-LABEL: lea_stop_foo:
927+
; MEDIUM-STATIC: # %bb.0:
928+
; MEDIUM-STATIC-NEXT: movabsq $__stop_foo, %rax
929+
; MEDIUM-STATIC-NEXT: retq
930+
;
931+
; LARGE-STATIC-LABEL: lea_stop_foo:
932+
; LARGE-STATIC: # %bb.0:
933+
; LARGE-STATIC-NEXT: movabsq $__stop_foo, %rax
934+
; LARGE-STATIC-NEXT: retq
935+
;
936+
; SMALL-PIC-LABEL: lea_stop_foo:
937+
; SMALL-PIC: # %bb.0:
938+
; SMALL-PIC-NEXT: leaq __stop_foo(%rip), %rax
939+
; SMALL-PIC-NEXT: retq
940+
;
941+
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_stop_foo:
942+
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
943+
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
944+
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $__stop_foo@GOTOFF, %rax
945+
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
946+
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
947+
;
948+
; MEDIUM-PIC-LABEL: lea_stop_foo:
949+
; MEDIUM-PIC: # %bb.0:
950+
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
951+
; MEDIUM-PIC-NEXT: movabsq $__stop_foo@GOTOFF, %rax
952+
; MEDIUM-PIC-NEXT: addq %rcx, %rax
953+
; MEDIUM-PIC-NEXT: retq
954+
;
955+
; LARGE-PIC-LABEL: lea_stop_foo:
956+
; LARGE-PIC: # %bb.0:
957+
; LARGE-PIC-NEXT: .L15$pb:
958+
; LARGE-PIC-NEXT: leaq .L15$pb(%rip), %rax
959+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15$pb, %rcx
960+
; LARGE-PIC-NEXT: addq %rax, %rcx
961+
; LARGE-PIC-NEXT: movabsq $__stop_foo@GOTOFF, %rax
962+
; LARGE-PIC-NEXT: addq %rcx, %rax
963+
; LARGE-PIC-NEXT: retq
964+
;
965+
; LARGE-SMALL-DATA-PIC-LABEL: lea_stop_foo:
966+
; LARGE-SMALL-DATA-PIC: # %bb.0:
967+
; LARGE-SMALL-DATA-PIC-NEXT: .L15$pb:
968+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L15$pb(%rip), %rax
969+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15$pb, %rcx
970+
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
971+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $__stop_foo@GOTOFF, %rax
972+
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
973+
; LARGE-SMALL-DATA-PIC-NEXT: retq
974+
ret ptr @__stop_foo
975+
}
976+
861977
define dso_local void @global_fn() #0 {
862978
; CHECK-LABEL: global_fn:
863979
; CHECK: # %bb.0:
@@ -919,19 +1035,19 @@ define dso_local ptr @lea_static_fn() #0 {
9191035
;
9201036
; LARGE-PIC-LABEL: lea_static_fn:
9211037
; LARGE-PIC: # %bb.0:
922-
; LARGE-PIC-NEXT: .L17$pb:
923-
; LARGE-PIC-NEXT: leaq .L17$pb(%rip), %rax
924-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
1038+
; LARGE-PIC-NEXT: .L19$pb:
1039+
; LARGE-PIC-NEXT: leaq .L19$pb(%rip), %rax
1040+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
9251041
; LARGE-PIC-NEXT: addq %rax, %rcx
9261042
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
9271043
; LARGE-PIC-NEXT: addq %rcx, %rax
9281044
; LARGE-PIC-NEXT: retq
9291045
;
9301046
; LARGE-SMALL-DATA-PIC-LABEL: lea_static_fn:
9311047
; LARGE-SMALL-DATA-PIC: # %bb.0:
932-
; LARGE-SMALL-DATA-PIC-NEXT: .L17$pb:
933-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L17$pb(%rip), %rax
934-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
1048+
; LARGE-SMALL-DATA-PIC-NEXT: .L19$pb:
1049+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L19$pb(%rip), %rax
1050+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
9351051
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
9361052
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
9371053
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
@@ -972,19 +1088,19 @@ define dso_local ptr @lea_global_fn() #0 {
9721088
;
9731089
; LARGE-PIC-LABEL: lea_global_fn:
9741090
; LARGE-PIC: # %bb.0:
975-
; LARGE-PIC-NEXT: .L18$pb:
976-
; LARGE-PIC-NEXT: leaq .L18$pb(%rip), %rax
977-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L18$pb, %rcx
1091+
; LARGE-PIC-NEXT: .L20$pb:
1092+
; LARGE-PIC-NEXT: leaq .L20$pb(%rip), %rax
1093+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
9781094
; LARGE-PIC-NEXT: addq %rax, %rcx
9791095
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
9801096
; LARGE-PIC-NEXT: addq %rcx, %rax
9811097
; LARGE-PIC-NEXT: retq
9821098
;
9831099
; LARGE-SMALL-DATA-PIC-LABEL: lea_global_fn:
9841100
; LARGE-SMALL-DATA-PIC: # %bb.0:
985-
; LARGE-SMALL-DATA-PIC-NEXT: .L18$pb:
986-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L18$pb(%rip), %rax
987-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L18$pb, %rcx
1101+
; LARGE-SMALL-DATA-PIC-NEXT: .L20$pb:
1102+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L20$pb(%rip), %rax
1103+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
9881104
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
9891105
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
9901106
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
@@ -1025,19 +1141,19 @@ define dso_local ptr @lea_extern_fn() #0 {
10251141
;
10261142
; LARGE-PIC-LABEL: lea_extern_fn:
10271143
; LARGE-PIC: # %bb.0:
1028-
; LARGE-PIC-NEXT: .L19$pb:
1029-
; LARGE-PIC-NEXT: leaq .L19$pb(%rip), %rax
1030-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
1144+
; LARGE-PIC-NEXT: .L21$pb:
1145+
; LARGE-PIC-NEXT: leaq .L21$pb(%rip), %rax
1146+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
10311147
; LARGE-PIC-NEXT: addq %rax, %rcx
10321148
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
10331149
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
10341150
; LARGE-PIC-NEXT: retq
10351151
;
10361152
; LARGE-SMALL-DATA-PIC-LABEL: lea_extern_fn:
10371153
; LARGE-SMALL-DATA-PIC: # %bb.0:
1038-
; LARGE-SMALL-DATA-PIC-NEXT: .L19$pb:
1039-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L19$pb(%rip), %rax
1040-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
1154+
; LARGE-SMALL-DATA-PIC-NEXT: .L21$pb:
1155+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L21$pb(%rip), %rax
1156+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
10411157
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
10421158
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $extern_fn@GOT, %rax
10431159
; LARGE-SMALL-DATA-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -1078,19 +1194,19 @@ define dso_local ptr @lea_ifunc() #0 {
10781194
;
10791195
; LARGE-PIC-LABEL: lea_ifunc:
10801196
; LARGE-PIC: # %bb.0:
1081-
; LARGE-PIC-NEXT: .L20$pb:
1082-
; LARGE-PIC-NEXT: leaq .L20$pb(%rip), %rax
1083-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
1197+
; LARGE-PIC-NEXT: .L22$pb:
1198+
; LARGE-PIC-NEXT: leaq .L22$pb(%rip), %rax
1199+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L22$pb, %rcx
10841200
; LARGE-PIC-NEXT: addq %rax, %rcx
10851201
; LARGE-PIC-NEXT: movabsq $ifunc_func@GOT, %rax
10861202
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
10871203
; LARGE-PIC-NEXT: retq
10881204
;
10891205
; LARGE-SMALL-DATA-PIC-LABEL: lea_ifunc:
10901206
; LARGE-SMALL-DATA-PIC: # %bb.0:
1091-
; LARGE-SMALL-DATA-PIC-NEXT: .L20$pb:
1092-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L20$pb(%rip), %rax
1093-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
1207+
; LARGE-SMALL-DATA-PIC-NEXT: .L22$pb:
1208+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L22$pb(%rip), %rax
1209+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L22$pb, %rcx
10941210
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
10951211
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $ifunc_func@GOT, %rax
10961212
; LARGE-SMALL-DATA-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -1131,19 +1247,19 @@ define dso_local ptr @lea_dso_local_ifunc() #0 {
11311247
;
11321248
; LARGE-PIC-LABEL: lea_dso_local_ifunc:
11331249
; LARGE-PIC: # %bb.0:
1134-
; LARGE-PIC-NEXT: .L21$pb:
1135-
; LARGE-PIC-NEXT: leaq .L21$pb(%rip), %rax
1136-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
1250+
; LARGE-PIC-NEXT: .L23$pb:
1251+
; LARGE-PIC-NEXT: leaq .L23$pb(%rip), %rax
1252+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L23$pb, %rcx
11371253
; LARGE-PIC-NEXT: addq %rax, %rcx
11381254
; LARGE-PIC-NEXT: movabsq $dso_local_ifunc_func@GOTOFF, %rax
11391255
; LARGE-PIC-NEXT: addq %rcx, %rax
11401256
; LARGE-PIC-NEXT: retq
11411257
;
11421258
; LARGE-SMALL-DATA-PIC-LABEL: lea_dso_local_ifunc:
11431259
; LARGE-SMALL-DATA-PIC: # %bb.0:
1144-
; LARGE-SMALL-DATA-PIC-NEXT: .L21$pb:
1145-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L21$pb(%rip), %rax
1146-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
1260+
; LARGE-SMALL-DATA-PIC-NEXT: .L23$pb:
1261+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L23$pb(%rip), %rax
1262+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L23$pb, %rcx
11471263
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
11481264
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $dso_local_ifunc_func@GOTOFF, %rax
11491265
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
@@ -1218,19 +1334,19 @@ define dso_local float @load_constant_pool(float %x) #0 {
12181334
;
12191335
; LARGE-PIC-LABEL: load_constant_pool:
12201336
; LARGE-PIC: # %bb.0:
1221-
; LARGE-PIC-NEXT: .L23$pb:
1222-
; LARGE-PIC-NEXT: leaq .L23$pb(%rip), %rax
1223-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L23$pb, %rcx
1337+
; LARGE-PIC-NEXT: .L25$pb:
1338+
; LARGE-PIC-NEXT: leaq .L25$pb(%rip), %rax
1339+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L25$pb, %rcx
12241340
; LARGE-PIC-NEXT: addq %rax, %rcx
12251341
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
12261342
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
12271343
; LARGE-PIC-NEXT: retq
12281344
;
12291345
; LARGE-SMALL-DATA-PIC-LABEL: load_constant_pool:
12301346
; LARGE-SMALL-DATA-PIC: # %bb.0:
1231-
; LARGE-SMALL-DATA-PIC-NEXT: .L23$pb:
1232-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L23$pb(%rip), %rax
1233-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L23$pb, %rcx
1347+
; LARGE-SMALL-DATA-PIC-NEXT: .L25$pb:
1348+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L25$pb(%rip), %rax
1349+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L25$pb, %rcx
12341350
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
12351351
; LARGE-SMALL-DATA-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
12361352
; LARGE-SMALL-DATA-PIC-NEXT: addss (%rcx,%rax), %xmm0

0 commit comments

Comments
 (0)