Skip to content

Commit d6e07e0

Browse files
authored
[X86] Treat __ehdr_start as large (#79884)
The __ehdr_start symbol is added by the linker and points to the ELF file headers, which can be very far away from text. Treat it as a large symbol under the medium/large code models. Performance to access __ehdr_start is almost certainly not important. There are a couple of other symbols that the linker adds [1], but this is the most relevant one that may be far away from text. [1] https://github.com/llvm/llvm-project/blob/547c395b279a93357082ac06cf3e8fe37ebfc3fe/lld/ELF/Writer.cpp#L226
1 parent c82f3ca commit d6e07e0

File tree

2 files changed

+96
-36
lines changed

2 files changed

+96
-36
lines changed

llvm/lib/Target/TargetMachine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ 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")
89+
return true;
8890
const DataLayout &DL = GV->getParent()->getDataLayout();
8991
uint64_t Size = DL.getTypeSizeInBits(GV->getValueType()) / 8;
9092
return Size == 0 || Size > LargeDataThreshold;

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

Lines changed: 94 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ target triple = "x86_64--linux"
5757
@opaque = external dso_local global %t
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
60+
@__ehdr_start = external dso_local global i8
6061

6162
define dso_local ptr @lea_static_data() #0 {
6263
; SMALL-STATIC-LABEL: lea_static_data:
@@ -800,6 +801,63 @@ define dso_local ptr @lea_opaque() #0 {
800801
ret ptr @opaque
801802
}
802803

804+
define dso_local ptr @lea_ehdr_start() #0 {
805+
; SMALL-STATIC-LABEL: lea_ehdr_start:
806+
; SMALL-STATIC: # %bb.0:
807+
; SMALL-STATIC-NEXT: movl $__ehdr_start, %eax
808+
; SMALL-STATIC-NEXT: retq
809+
;
810+
; MEDIUM-STATIC-LABEL: lea_ehdr_start:
811+
; MEDIUM-STATIC: # %bb.0:
812+
; MEDIUM-STATIC-NEXT: movabsq $__ehdr_start, %rax
813+
; MEDIUM-STATIC-NEXT: retq
814+
;
815+
; LARGE-STATIC-LABEL: lea_ehdr_start:
816+
; LARGE-STATIC: # %bb.0:
817+
; LARGE-STATIC-NEXT: movabsq $__ehdr_start, %rax
818+
; LARGE-STATIC-NEXT: retq
819+
;
820+
; SMALL-PIC-LABEL: lea_ehdr_start:
821+
; SMALL-PIC: # %bb.0:
822+
; SMALL-PIC-NEXT: leaq __ehdr_start(%rip), %rax
823+
; SMALL-PIC-NEXT: retq
824+
;
825+
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_ehdr_start:
826+
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
827+
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
828+
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $__ehdr_start@GOTOFF, %rax
829+
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
830+
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
831+
;
832+
; MEDIUM-PIC-LABEL: lea_ehdr_start:
833+
; MEDIUM-PIC: # %bb.0:
834+
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
835+
; MEDIUM-PIC-NEXT: movabsq $__ehdr_start@GOTOFF, %rax
836+
; MEDIUM-PIC-NEXT: addq %rcx, %rax
837+
; MEDIUM-PIC-NEXT: retq
838+
;
839+
; LARGE-PIC-LABEL: lea_ehdr_start:
840+
; LARGE-PIC: # %bb.0:
841+
; LARGE-PIC-NEXT: .L13$pb:
842+
; LARGE-PIC-NEXT: leaq .L13$pb(%rip), %rax
843+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
844+
; LARGE-PIC-NEXT: addq %rax, %rcx
845+
; LARGE-PIC-NEXT: movabsq $__ehdr_start@GOTOFF, %rax
846+
; LARGE-PIC-NEXT: addq %rcx, %rax
847+
; LARGE-PIC-NEXT: retq
848+
;
849+
; LARGE-SMALL-DATA-PIC-LABEL: lea_ehdr_start:
850+
; LARGE-SMALL-DATA-PIC: # %bb.0:
851+
; LARGE-SMALL-DATA-PIC-NEXT: .L13$pb:
852+
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L13$pb(%rip), %rax
853+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
854+
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
855+
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $__ehdr_start@GOTOFF, %rax
856+
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
857+
; LARGE-SMALL-DATA-PIC-NEXT: retq
858+
ret ptr @__ehdr_start
859+
}
860+
803861
define dso_local void @global_fn() #0 {
804862
; CHECK-LABEL: global_fn:
805863
; CHECK: # %bb.0:
@@ -861,19 +919,19 @@ define dso_local ptr @lea_static_fn() #0 {
861919
;
862920
; LARGE-PIC-LABEL: lea_static_fn:
863921
; LARGE-PIC: # %bb.0:
864-
; LARGE-PIC-NEXT: .L16$pb:
865-
; LARGE-PIC-NEXT: leaq .L16$pb(%rip), %rax
866-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L16$pb, %rcx
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
867925
; LARGE-PIC-NEXT: addq %rax, %rcx
868926
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
869927
; LARGE-PIC-NEXT: addq %rcx, %rax
870928
; LARGE-PIC-NEXT: retq
871929
;
872930
; LARGE-SMALL-DATA-PIC-LABEL: lea_static_fn:
873931
; LARGE-SMALL-DATA-PIC: # %bb.0:
874-
; LARGE-SMALL-DATA-PIC-NEXT: .L16$pb:
875-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L16$pb(%rip), %rax
876-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L16$pb, %rcx
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
877935
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
878936
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
879937
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
@@ -914,19 +972,19 @@ define dso_local ptr @lea_global_fn() #0 {
914972
;
915973
; LARGE-PIC-LABEL: lea_global_fn:
916974
; LARGE-PIC: # %bb.0:
917-
; LARGE-PIC-NEXT: .L17$pb:
918-
; LARGE-PIC-NEXT: leaq .L17$pb(%rip), %rax
919-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
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
920978
; LARGE-PIC-NEXT: addq %rax, %rcx
921979
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
922980
; LARGE-PIC-NEXT: addq %rcx, %rax
923981
; LARGE-PIC-NEXT: retq
924982
;
925983
; LARGE-SMALL-DATA-PIC-LABEL: lea_global_fn:
926984
; LARGE-SMALL-DATA-PIC: # %bb.0:
927-
; LARGE-SMALL-DATA-PIC-NEXT: .L17$pb:
928-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L17$pb(%rip), %rax
929-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
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
930988
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
931989
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
932990
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
@@ -967,19 +1025,19 @@ define dso_local ptr @lea_extern_fn() #0 {
9671025
;
9681026
; LARGE-PIC-LABEL: lea_extern_fn:
9691027
; LARGE-PIC: # %bb.0:
970-
; LARGE-PIC-NEXT: .L18$pb:
971-
; LARGE-PIC-NEXT: leaq .L18$pb(%rip), %rax
972-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L18$pb, %rcx
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
9731031
; LARGE-PIC-NEXT: addq %rax, %rcx
9741032
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
9751033
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
9761034
; LARGE-PIC-NEXT: retq
9771035
;
9781036
; LARGE-SMALL-DATA-PIC-LABEL: lea_extern_fn:
9791037
; LARGE-SMALL-DATA-PIC: # %bb.0:
980-
; LARGE-SMALL-DATA-PIC-NEXT: .L18$pb:
981-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L18$pb(%rip), %rax
982-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L18$pb, %rcx
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
9831041
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
9841042
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $extern_fn@GOT, %rax
9851043
; LARGE-SMALL-DATA-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -1020,19 +1078,19 @@ define dso_local ptr @lea_ifunc() #0 {
10201078
;
10211079
; LARGE-PIC-LABEL: lea_ifunc:
10221080
; LARGE-PIC: # %bb.0:
1023-
; LARGE-PIC-NEXT: .L19$pb:
1024-
; LARGE-PIC-NEXT: leaq .L19$pb(%rip), %rax
1025-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
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
10261084
; LARGE-PIC-NEXT: addq %rax, %rcx
10271085
; LARGE-PIC-NEXT: movabsq $ifunc_func@GOT, %rax
10281086
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
10291087
; LARGE-PIC-NEXT: retq
10301088
;
10311089
; LARGE-SMALL-DATA-PIC-LABEL: lea_ifunc:
10321090
; LARGE-SMALL-DATA-PIC: # %bb.0:
1033-
; LARGE-SMALL-DATA-PIC-NEXT: .L19$pb:
1034-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L19$pb(%rip), %rax
1035-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
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
10361094
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
10371095
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $ifunc_func@GOT, %rax
10381096
; LARGE-SMALL-DATA-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -1073,19 +1131,19 @@ define dso_local ptr @lea_dso_local_ifunc() #0 {
10731131
;
10741132
; LARGE-PIC-LABEL: lea_dso_local_ifunc:
10751133
; LARGE-PIC: # %bb.0:
1076-
; LARGE-PIC-NEXT: .L20$pb:
1077-
; LARGE-PIC-NEXT: leaq .L20$pb(%rip), %rax
1078-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
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
10791137
; LARGE-PIC-NEXT: addq %rax, %rcx
10801138
; LARGE-PIC-NEXT: movabsq $dso_local_ifunc_func@GOTOFF, %rax
10811139
; LARGE-PIC-NEXT: addq %rcx, %rax
10821140
; LARGE-PIC-NEXT: retq
10831141
;
10841142
; LARGE-SMALL-DATA-PIC-LABEL: lea_dso_local_ifunc:
10851143
; LARGE-SMALL-DATA-PIC: # %bb.0:
1086-
; LARGE-SMALL-DATA-PIC-NEXT: .L20$pb:
1087-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L20$pb(%rip), %rax
1088-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
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
10891147
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
10901148
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $dso_local_ifunc_func@GOTOFF, %rax
10911149
; LARGE-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
@@ -1160,19 +1218,19 @@ define dso_local float @load_constant_pool(float %x) #0 {
11601218
;
11611219
; LARGE-PIC-LABEL: load_constant_pool:
11621220
; LARGE-PIC: # %bb.0:
1163-
; LARGE-PIC-NEXT: .L22$pb:
1164-
; LARGE-PIC-NEXT: leaq .L22$pb(%rip), %rax
1165-
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L22$pb, %rcx
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
11661224
; LARGE-PIC-NEXT: addq %rax, %rcx
11671225
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
11681226
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
11691227
; LARGE-PIC-NEXT: retq
11701228
;
11711229
; LARGE-SMALL-DATA-PIC-LABEL: load_constant_pool:
11721230
; LARGE-SMALL-DATA-PIC: # %bb.0:
1173-
; LARGE-SMALL-DATA-PIC-NEXT: .L22$pb:
1174-
; LARGE-SMALL-DATA-PIC-NEXT: leaq .L22$pb(%rip), %rax
1175-
; LARGE-SMALL-DATA-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L22$pb, %rcx
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
11761234
; LARGE-SMALL-DATA-PIC-NEXT: addq %rax, %rcx
11771235
; LARGE-SMALL-DATA-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
11781236
; LARGE-SMALL-DATA-PIC-NEXT: addss (%rcx,%rax), %xmm0

0 commit comments

Comments
 (0)