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