Skip to content

Commit ed5072e

Browse files
authored
[NFC][lld-macho] Generate test bodies for icf-safe-thunk tests (#111927)
Autogenerate `.ll` code from cpp code in some `-icf-safe-thunk` tests using `update_test_body.py` ``` PATH=build/bin:$PATH llvm/utils/update_test_body.py lld/test/MachO/icf-safe-thunks.ll lld/test/MachO/icf-safe-thunks-dwarf.ll ``` https://llvm.org/docs/TestingGuide.html#elaborated-tests I recently became aware of this tool and I wanted to practice using it. This also allows to remove the custom instructions to generate the `.ll` code.
1 parent 4de708e commit ed5072e

File tree

2 files changed

+177
-231
lines changed

2 files changed

+177
-231
lines changed
Lines changed: 68 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,104 @@
1+
; NOTE: Code has been autogenerated by utils/update_test_body.py
12
; REQUIRES: aarch64
23

3-
;;; Build the
4-
; RUN: rm -rf %t; mkdir %t
5-
; RUN: llc -filetype=obj %s -O3 -o %t/icf-obj-safe-thunks-dwarf.o -enable-machine-outliner=never -mtriple arm64-apple-macos -addrsig
6-
; RUN: %lld -arch arm64 -lSystem --icf=safe_thunks -dylib -o %t/icf-safe-dwarf.dylib %t/icf-obj-safe-thunks-dwarf.o
4+
; RUN: rm -rf %t && split-file %s %t
5+
6+
; RUN: llc -filetype=obj %t/a.ll -O3 -o %t/a.o -enable-machine-outliner=never -mtriple arm64-apple-macos -addrsig
7+
; RUN: %lld -arch arm64 -lSystem --icf=safe_thunks -dylib -o %t/a.dylib %t/a.o
78

89
;;; Check that we generate valid dSYM
9-
; RUN: dsymutil %t/icf-safe-dwarf.dylib -o %t/icf-safe.dSYM
10-
; RUN: llvm-dwarfdump --verify %t/icf-safe.dSYM | FileCheck %s --check-prefix=VERIFY-DSYM
10+
; RUN: dsymutil %t/a.dylib -o %t/a.dSYM
11+
; RUN: llvm-dwarfdump --verify %t/a.dSYM | FileCheck %s --check-prefix=VERIFY-DSYM
1112
; VERIFY-DSYM: No errors.
1213

1314
;;; Check that we don't generate STABS entries (N_FUN) for ICF'ed function thunks
14-
; RUN: dsymutil -s %t/icf-safe-dwarf.dylib | FileCheck %s --check-prefix=VERIFY-STABS
15+
; RUN: dsymutil -s %t/a.dylib | FileCheck %s --check-prefix=VERIFY-STABS
1516
; VERIFY-STABS-NOT: N_FUN{{.*}}_func_B
1617
; VERIFY-STABS-NOT: N_FUN{{.*}}_func_C
1718

1819
;;; Check that we do generate STABS entries (N_FUN) for non-ICF'ed functions
1920
; VERIFY-STABS: N_FUN{{.*}}_func_A
2021
; VERIFY-STABS: N_FUN{{.*}}_take_func_addr
2122

23+
;--- a.cpp
24+
#define ATTR __attribute__((noinline)) extern "C"
25+
typedef unsigned long long ULL;
26+
27+
ATTR int func_A() { return 1; }
28+
ATTR int func_B() { return 1; }
29+
ATTR int func_C() { return 1; }
30+
31+
ATTR ULL take_func_addr() {
32+
ULL val = 0;
33+
val += (ULL)(void*)func_A;
34+
val += (ULL)(void*)func_B;
35+
val += (ULL)(void*)func_C;
36+
return val;
37+
}
38+
39+
;--- gen
40+
clang -target arm64-apple-macos11.0 -S -emit-llvm a.cpp -O3 -g -o -
2241

23-
; ModuleID = 'icf-safe-thunks-dwarf.cpp'
24-
source_filename = "icf-safe-thunks-dwarf.cpp"
42+
;--- a.ll
43+
; ModuleID = 'a.cpp'
44+
source_filename = "a.cpp"
2545
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
2646
target triple = "arm64-apple-macosx11.0.0"
2747

28-
; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
29-
define i32 @func_A() #0 !dbg !13 {
30-
entry:
31-
ret i32 1
48+
; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind ssp willreturn memory(none) uwtable(sync)
49+
define noundef i32 @func_A() #0 !dbg !12 {
50+
ret i32 1, !dbg !16
3251
}
3352

34-
; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
35-
define i32 @func_B() #0 !dbg !18 {
36-
entry:
37-
ret i32 1
53+
; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind ssp willreturn memory(none) uwtable(sync)
54+
define noundef i32 @func_B() #0 !dbg !17 {
55+
ret i32 1, !dbg !18
3856
}
3957

40-
; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
41-
define i32 @func_C() #0 !dbg !20 {
42-
entry:
43-
ret i32 1
58+
; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind ssp willreturn memory(none) uwtable(sync)
59+
define noundef i32 @func_C() #0 !dbg !19 {
60+
ret i32 1, !dbg !20
4461
}
4562

46-
; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
47-
define i64 @take_func_addr() #0 !dbg !22 {
48-
entry:
49-
%val = alloca i64, align 8
50-
store i64 0, ptr %val, align 8
51-
%0 = load i64, ptr %val, align 8
52-
%add = add i64 %0, ptrtoint (ptr @func_A to i64)
53-
store i64 %add, ptr %val, align 8
54-
%1 = load i64, ptr %val, align 8
55-
%add1 = add i64 %1, ptrtoint (ptr @func_B to i64)
56-
store i64 %add1, ptr %val, align 8
57-
%2 = load i64, ptr %val, align 8
58-
%add2 = add i64 %2, ptrtoint (ptr @func_C to i64)
59-
store i64 %add2, ptr %val, align 8
60-
%3 = load i64, ptr %val, align 8
61-
ret i64 %3
63+
; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind ssp willreturn memory(none) uwtable(sync)
64+
define noundef i64 @take_func_addr() local_unnamed_addr #0 !dbg !21 {
65+
#dbg_value(i64 0, !25, !DIExpression(), !26)
66+
#dbg_value(i64 ptrtoint (ptr @func_A to i64), !25, !DIExpression(), !26)
67+
#dbg_value(i64 add (i64 ptrtoint (ptr @func_A to i64), i64 ptrtoint (ptr @func_B to i64)), !25, !DIExpression(), !26)
68+
#dbg_value(i64 add (i64 add (i64 ptrtoint (ptr @func_A to i64), i64 ptrtoint (ptr @func_B to i64)), i64 ptrtoint (ptr @func_C to i64)), !25, !DIExpression(), !26)
69+
ret i64 add (i64 add (i64 ptrtoint (ptr @func_A to i64), i64 ptrtoint (ptr @func_B to i64)), i64 ptrtoint (ptr @func_C to i64)), !dbg !27
6270
}
6371

64-
attributes #0 = { noinline nounwind }
72+
attributes #0 = { mustprogress nofree noinline norecurse nosync nounwind ssp willreturn memory(none) uwtable(sync) "frame-pointer"="non-leaf" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+altnzcv,+ccdp,+ccidx,+complxnum,+crc,+dit,+dotprod,+flagm,+fp-armv8,+fp16fml,+fptoint,+fullfp16,+jsconv,+lse,+neon,+pauth,+perfmon,+predres,+ras,+rcpc,+rdm,+sb,+sha2,+sha3,+specrestrict,+ssbs,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8a,+zcm,+zcz" }
6573

6674
!llvm.dbg.cu = !{!0}
6775
!llvm.module.flags = !{!6, !7, !8, !9, !10, !11}
68-
!llvm.ident = !{!12}
6976

70-
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 20.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
71-
!1 = !DIFile(filename: "icf-safe-thunks-dwarf.cpp", directory: "/tmp/test")
77+
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, retainedTypes: !2, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
78+
!1 = !DIFile(filename: "a.cpp", directory: "/proc/self/cwd")
79+
!2 = !{!3, !5}
80+
!3 = !DIDerivedType(tag: DW_TAG_typedef, name: "ULL", file: !1, line: 2, baseType: !4)
81+
!4 = !DIBasicType(name: "unsigned long long", size: 64, encoding: DW_ATE_unsigned)
82+
!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
7283
!6 = !{i32 7, !"Dwarf Version", i32 4}
7384
!7 = !{i32 2, !"Debug Info Version", i32 3}
7485
!8 = !{i32 1, !"wchar_size", i32 4}
7586
!9 = !{i32 8, !"PIC Level", i32 2}
7687
!10 = !{i32 7, !"uwtable", i32 1}
7788
!11 = !{i32 7, !"frame-pointer", i32 1}
78-
!12 = !{!"clang version 20.0.0"}
79-
!13 = distinct !DISubprogram(name: "func_A", scope: !1, file: !1, line: 4, type: !14, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
80-
!14 = !DISubroutineType(types: !15)
81-
!15 = !{}
82-
!18 = distinct !DISubprogram(name: "func_B", scope: !1, file: !1, line: 5, type: !14, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
83-
!20 = distinct !DISubprogram(name: "func_C", scope: !1, file: !1, line: 6, type: !14, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
84-
!22 = distinct !DISubprogram(name: "take_func_addr", scope: !1, file: !1, line: 8, type: !14, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
85-
86-
87-
88-
89-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90-
;;;;;;;;;;;;;; Generate the above LLVM IR with the below script ;;;;;;;;;;;;;;;
91-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
92-
; #!/bin/bash
93-
; set -ex
94-
; TOOLCHAIN_BIN="llvm-project/build/Debug/bin"
95-
;
96-
; # Create icf-safe-thunks-dwarf.cpp file
97-
; cat > icf-safe-thunks-dwarf.cpp <<EOF
98-
; #define ATTR __attribute__((noinline)) extern "C"
99-
; typedef unsigned long long ULL;
100-
;
101-
; ATTR int func_A() { return 1; }
102-
; ATTR int func_B() { return 1; }
103-
; ATTR int func_C() { return 1; }
104-
;
105-
; ATTR ULL take_func_addr() {
106-
; ULL val = 0;
107-
; val += (ULL)(void*)func_A;
108-
; val += (ULL)(void*)func_B;
109-
; val += (ULL)(void*)func_C;
110-
; return val;
111-
; }
112-
; EOF
113-
;
114-
; $TOOLCHAIN_BIN/clang -target arm64-apple-macos11.0 -S -emit-llvm -g \
115-
; icf-safe-thunks-dwarf.cpp
89+
!12 = distinct !DISubprogram(name: "func_A", scope: !1, file: !1, line: 4, type: !13, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
90+
!13 = !DISubroutineType(types: !14)
91+
!14 = !{!15}
92+
!15 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
93+
!16 = !DILocation(line: 4, column: 21, scope: !12)
94+
!17 = distinct !DISubprogram(name: "func_B", scope: !1, file: !1, line: 5, type: !13, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
95+
!18 = !DILocation(line: 5, column: 21, scope: !17)
96+
!19 = distinct !DISubprogram(name: "func_C", scope: !1, file: !1, line: 6, type: !13, scopeLine: 6, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
97+
!20 = !DILocation(line: 6, column: 21, scope: !19)
98+
!21 = distinct !DISubprogram(name: "take_func_addr", scope: !1, file: !1, line: 8, type: !22, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !24)
99+
!22 = !DISubroutineType(types: !23)
100+
!23 = !{!3}
101+
!24 = !{!25}
102+
!25 = !DILocalVariable(name: "val", scope: !21, file: !1, line: 9, type: !3)
103+
!26 = !DILocation(line: 0, scope: !21)
104+
!27 = !DILocation(line: 13, column: 5, scope: !21)

0 commit comments

Comments
 (0)