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