|
| 1 | +; NOTE: Code has been autogenerated by utils/update_test_body.py |
1 | 2 | ; REQUIRES: aarch64
|
2 | 3 |
|
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 |
7 | 8 |
|
8 | 9 | ;;; 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 |
11 | 12 | ; VERIFY-DSYM: No errors.
|
12 | 13 |
|
13 | 14 | ;;; 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 |
15 | 16 | ; VERIFY-STABS-NOT: N_FUN{{.*}}_func_B
|
16 | 17 | ; VERIFY-STABS-NOT: N_FUN{{.*}}_func_C
|
17 | 18 |
|
18 | 19 | ;;; Check that we do generate STABS entries (N_FUN) for non-ICF'ed functions
|
19 | 20 | ; VERIFY-STABS: N_FUN{{.*}}_func_A
|
20 | 21 | ; VERIFY-STABS: N_FUN{{.*}}_take_func_addr
|
21 | 22 |
|
| 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 - |
22 | 41 |
|
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" |
25 | 45 | target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
|
26 | 46 | target triple = "arm64-apple-macosx11.0.0"
|
27 | 47 |
|
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 |
32 | 51 | }
|
33 | 52 |
|
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 |
38 | 56 | }
|
39 | 57 |
|
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 |
44 | 61 | }
|
45 | 62 |
|
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 |
62 | 70 | }
|
63 | 71 |
|
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" } |
65 | 73 |
|
66 | 74 | !llvm.dbg.cu = !{!0}
|
67 | 75 | !llvm.module.flags = !{!6, !7, !8, !9, !10, !11}
|
68 |
| -!llvm.ident = !{!12} |
69 | 76 |
|
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) |
72 | 83 | !6 = !{i32 7, !"Dwarf Version", i32 4}
|
73 | 84 | !7 = !{i32 2, !"Debug Info Version", i32 3}
|
74 | 85 | !8 = !{i32 1, !"wchar_size", i32 4}
|
75 | 86 | !9 = !{i32 8, !"PIC Level", i32 2}
|
76 | 87 | !10 = !{i32 7, !"uwtable", i32 1}
|
77 | 88 | !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