xref: /llvm-project/llvm/test/CodeGen/WinCFGuard/cfguard-mingw.ll (revision 20b15e645cdbde07ae46aefe46ede5ff4d1e8ba3)
1; RUN: llc < %s -mtriple=x86_64-w64-windows-gnu | FileCheck %s
2; Control Flow Guard is currently only available on Windows
3
4; This file was generated from the following source, using this command line:
5; clang++ -target x86_64-w64-windows-gnu cfguard-mingw.cpp -S -emit-llvm -o cfguard-mingw.ll -O -Xclang -cfguard
6;
7;-------------------------------------------------------------------------------
8; class __attribute__((dllexport)) Base {
9; public:
10;     __attribute__((dllexport)) Base() = default;
11;     __attribute__((dllexport)) virtual ~Base() = default;
12;     __attribute__((dllexport)) virtual int calc() const {
13;         return m_field * 2;
14;     }
15;     int m_field{0};
16; };
17;
18; class __attribute__((dllexport)) Derived : public Base {
19; public:
20;     __attribute__((dllexport)) Derived() = default;
21;     __attribute__((dllexport)) ~Derived() override = default;
22;     __attribute__((dllexport)) int calc() const override {
23;         return m_field * 2 + m_newfield;
24;     }
25;     int m_newfield{0};
26; };
27;
28; __attribute((noinline)) void address_taken() {}
29; __attribute((noinline)) void address_not_taken() {}
30;
31; using fn_t = void (*)();
32; __attribute__((dllexport)) fn_t get_address() {
33;     address_not_taken();
34;     return &address_taken;
35; }
36;-------------------------------------------------------------------------------
37
38; CHECK: .set @feat.00, 2048
39
40; CHECK: .section .gfids$y
41; CHECK: .symidx _ZNK7Derived4calcEv
42; CHECK: .symidx _Z13address_takenv
43
44; ModuleID = 'cfguard-mingw.cpp'
45source_filename = "cfguard-mingw.cpp"
46target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
47target triple = "x86_64-w64-windows-gnu"
48
49%class.Base = type <{ ptr, i32, [4 x i8] }>
50%class.Derived = type { %class.Base.base, i32 }
51%class.Base.base = type <{ ptr, i32 }>
52
53$_ZN4BaseC2Ev = comdat any
54
55$_ZN4BaseC1Ev = comdat any
56
57$_ZNK4Base4calcEv = comdat any
58
59$_ZN4BaseD2Ev = comdat any
60
61$_ZN4BaseD1Ev = comdat any
62
63$_ZN4BaseD0Ev = comdat any
64
65$_ZN7DerivedC2Ev = comdat any
66
67$_ZN7DerivedC1Ev = comdat any
68
69$_ZNK7Derived4calcEv = comdat any
70
71$_ZN7DerivedD2Ev = comdat any
72
73$_ZN7DerivedD1Ev = comdat any
74
75$_ZN7DerivedD0Ev = comdat any
76
77$_ZTV4Base = comdat any
78
79$_ZTV7Derived = comdat any
80
81$_ZTS4Base = comdat any
82
83$_ZTI4Base = comdat any
84
85$_ZTS7Derived = comdat any
86
87$_ZTI7Derived = comdat any
88
89@_ZTV4Base = weak_odr dso_local dllexport unnamed_addr constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTI4Base, ptr @_ZN4BaseD1Ev, ptr @_ZN4BaseD0Ev, ptr @_ZNK4Base4calcEv] }, comdat, align 8
90@_ZTV7Derived = weak_odr dso_local dllexport unnamed_addr constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTI7Derived, ptr @_ZN7DerivedD1Ev, ptr @_ZN7DerivedD0Ev, ptr @_ZNK7Derived4calcEv] }, comdat, align 8
91@_ZTVN10__cxxabiv117__class_type_infoE = external global ptr
92@_ZTS4Base = linkonce_odr dso_local constant [6 x i8] c"4Base\00", comdat, align 1
93@_ZTI4Base = linkonce_odr dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS4Base }, comdat, align 8
94@_ZTVN10__cxxabiv120__si_class_type_infoE = external global ptr
95@_ZTS7Derived = linkonce_odr dso_local constant [9 x i8] c"7Derived\00", comdat, align 1
96@_ZTI7Derived = linkonce_odr dso_local constant { ptr, ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr @_ZTS7Derived, ptr @_ZTI4Base }, comdat, align 8
97
98; Function Attrs: nounwind uwtable
99define weak_odr dso_local dllexport void @_ZN4BaseC2Ev(ptr noundef nonnull align 8 dereferenceable(12) %0) unnamed_addr #0 comdat align 2 {
100  store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @_ZTV4Base, i64 0, i32 0, i64 2), ptr %0, align 8, !tbaa !5
101  %2 = getelementptr inbounds %class.Base, ptr %0, i64 0, i32 1
102  store i32 0, ptr %2, align 8, !tbaa !8
103  ret void
104}
105
106; Function Attrs: nounwind uwtable
107define weak_odr dso_local dllexport void @_ZN4BaseC1Ev(ptr noundef nonnull align 8 dereferenceable(12) %0) unnamed_addr #0 comdat align 2 {
108  store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @_ZTV4Base, i64 0, i32 0, i64 2), ptr %0, align 8, !tbaa !5
109  %2 = getelementptr inbounds %class.Base, ptr %0, i64 0, i32 1
110  store i32 0, ptr %2, align 8, !tbaa !8
111  ret void
112}
113
114; Function Attrs: mustprogress nounwind uwtable
115define weak_odr dso_local dllexport noundef i32 @_ZNK4Base4calcEv(ptr noundef nonnull align 8 dereferenceable(12) %0) unnamed_addr #1 comdat align 2 {
116  %2 = getelementptr inbounds %class.Base, ptr %0, i64 0, i32 1
117  %3 = load i32, ptr %2, align 8, !tbaa !8
118  %4 = shl nsw i32 %3, 1
119  ret i32 %4
120}
121
122; Function Attrs: nounwind uwtable
123define weak_odr dso_local dllexport void @_ZN4BaseD2Ev(ptr noundef nonnull align 8 dereferenceable(12) %0) unnamed_addr #0 comdat align 2 {
124  ret void
125}
126
127; Function Attrs: nounwind uwtable
128define weak_odr dso_local dllexport void @_ZN4BaseD1Ev(ptr noundef nonnull align 8 dereferenceable(12) %0) unnamed_addr #0 comdat align 2 {
129  ret void
130}
131
132; Function Attrs: nounwind uwtable
133define weak_odr dso_local dllexport void @_ZN4BaseD0Ev(ptr noundef nonnull align 8 dereferenceable(12) %0) unnamed_addr #0 comdat align 2 {
134  tail call void @_ZdlPv(ptr noundef nonnull %0) #5
135  ret void
136}
137
138; Function Attrs: nobuiltin nounwind
139declare dso_local void @_ZdlPv(ptr noundef) local_unnamed_addr #2
140
141; Function Attrs: nounwind uwtable
142define weak_odr dso_local dllexport void @_ZN7DerivedC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %0) unnamed_addr #0 comdat align 2 {
143  store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @_ZTV4Base, i64 0, i32 0, i64 2), ptr %0, align 8, !tbaa !5
144  %2 = getelementptr inbounds %class.Base, ptr %0, i64 0, i32 1
145  store i32 0, ptr %2, align 8, !tbaa !8
146  store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @_ZTV7Derived, i64 0, i32 0, i64 2), ptr %0, align 8, !tbaa !5
147  %3 = getelementptr inbounds %class.Derived, ptr %0, i64 0, i32 1
148  store i32 0, ptr %3, align 4, !tbaa !12
149  ret void
150}
151
152; Function Attrs: nounwind uwtable
153define weak_odr dso_local dllexport void @_ZN7DerivedC1Ev(ptr noundef nonnull align 8 dereferenceable(16) %0) unnamed_addr #0 comdat align 2 {
154  store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @_ZTV4Base, i64 0, i32 0, i64 2), ptr %0, align 8, !tbaa !5
155  %2 = getelementptr inbounds %class.Base, ptr %0, i64 0, i32 1
156  store i32 0, ptr %2, align 8, !tbaa !8
157  store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @_ZTV7Derived, i64 0, i32 0, i64 2), ptr %0, align 8, !tbaa !5
158  %3 = getelementptr inbounds %class.Derived, ptr %0, i64 0, i32 1
159  store i32 0, ptr %3, align 4, !tbaa !12
160  ret void
161}
162
163; Function Attrs: mustprogress nounwind uwtable
164define weak_odr dso_local dllexport noundef i32 @_ZNK7Derived4calcEv(ptr noundef nonnull align 8 dereferenceable(16) %0) unnamed_addr #1 comdat align 2 {
165  %2 = getelementptr inbounds %class.Base, ptr %0, i64 0, i32 1
166  %3 = load i32, ptr %2, align 8, !tbaa !8
167  %4 = shl nsw i32 %3, 1
168  %5 = getelementptr inbounds %class.Derived, ptr %0, i64 0, i32 1
169  %6 = load i32, ptr %5, align 4, !tbaa !12
170  %7 = add nsw i32 %4, %6
171  ret i32 %7
172}
173
174; Function Attrs: nounwind uwtable
175define weak_odr dso_local dllexport void @_ZN7DerivedD2Ev(ptr noundef nonnull align 8 dereferenceable(16) %0) unnamed_addr #0 comdat align 2 {
176  ret void
177}
178
179; Function Attrs: nounwind uwtable
180define weak_odr dso_local dllexport void @_ZN7DerivedD1Ev(ptr noundef nonnull align 8 dereferenceable(16) %0) unnamed_addr #0 comdat align 2 {
181  ret void
182}
183
184; Function Attrs: nounwind uwtable
185define weak_odr dso_local dllexport void @_ZN7DerivedD0Ev(ptr noundef nonnull align 8 dereferenceable(16) %0) unnamed_addr #0 comdat align 2 {
186  tail call void @_ZdlPv(ptr noundef nonnull %0) #5
187  ret void
188}
189
190; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind readnone willreturn uwtable
191define dso_local void @_Z13address_takenv() #3 {
192  ret void
193}
194
195; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind readnone willreturn uwtable
196define dso_local void @_Z17address_not_takenv() local_unnamed_addr #3 {
197  ret void
198}
199
200; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn uwtable
201define dso_local dllexport noundef nonnull ptr @_Z11get_addressv() local_unnamed_addr #4 {
202  ret ptr @_Z13address_takenv
203}
204
205attributes #0 = { nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
206attributes #1 = { mustprogress nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
207attributes #2 = { nobuiltin nounwind "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
208attributes #3 = { mustprogress nofree noinline norecurse nosync nounwind readnone willreturn uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
209attributes #4 = { mustprogress nofree norecurse nosync nounwind readnone willreturn uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
210attributes #5 = { builtin nounwind }
211
212!llvm.module.flags = !{!0, !1, !2, !3}
213!llvm.ident = !{!4}
214
215!0 = !{i32 2, !"cfguard", i32 2}
216!1 = !{i32 1, !"wchar_size", i32 2}
217!2 = !{i32 8, !"PIC Level", i32 2}
218!3 = !{i32 7, !"uwtable", i32 2}
219!4 = !{!"clang version 16.0.0"}
220!5 = !{!6, !6, i64 0}
221!6 = !{!"vtable pointer", !7, i64 0}
222!7 = !{!"Simple C++ TBAA"}
223!8 = !{!9, !10, i64 8}
224!9 = !{!"_ZTS4Base", !10, i64 8}
225!10 = !{!"int", !11, i64 0}
226!11 = !{!"omnipotent char", !7, i64 0}
227!12 = !{!13, !10, i64 12}
228!13 = !{!"_ZTS7Derived", !9, i64 0, !10, i64 12}
229