Since ThinLTOBitcodeWriterPass handles many things for CFI and WPD, like updating vtable linkage, we need to prevent those changes from persisting in the non-LTO object code we will compile under FatLTO. The only non-invasive way to do that is to clone the module when serializing the module in ThinLTOBitcodeWriterPass. We may be able to avoid cloning in the future with additional infrastructure to restore the IR to its original state. Fixes #139440
34 lines
1.8 KiB
LLVM
34 lines
1.8 KiB
LLVM
; RUN: opt --mtriple x86_64-unknown-linux-gnu < %s -passes="embed-bitcode<thinlto>" -S | FileCheck %s
|
|
|
|
; CHECK: $_ZTV3Foo = comdat any
|
|
$_ZTV3Foo = comdat any
|
|
|
|
$_ZTI3Foo = comdat any
|
|
|
|
;; ThinLTOBitcodeWriter will remove the vtable for Foo, and make it an external symbol
|
|
; CHECK: @_ZTV3Foo = linkonce_odr hidden unnamed_addr constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTI3Foo, ptr @_ZN3FooD2Ev, ptr @_ZN3FooD0Ev, ptr @_ZNKSt13runtime_error4whatEv] }, comdat, align 8, !type !0, !type !1, !type !2, !type !3, !type !4, !type !5
|
|
; CHECK-NOT: @foo = external unnamed_addr constant { [5 x ptr] }, align 8
|
|
; CHECK: @llvm.embedded.object = private constant {{.*}}, section ".llvm.lto", align 1
|
|
; CHECK: @llvm.compiler.used = appending global [1 x ptr] [ptr @llvm.embedded.object], section "llvm.metadata"
|
|
@_ZTV3Foo = linkonce_odr hidden unnamed_addr constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTI3Foo, ptr @_ZN3FooD2Ev, ptr @_ZN3FooD0Ev, ptr @_ZNKSt13runtime_error4whatEv] }, comdat, align 8, !type !0, !type !1, !type !2, !type !3, !type !4, !type !5
|
|
@_ZTI3Foo = linkonce_odr hidden constant { ptr, ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr @_ZTS3Foo, ptr @_ZTISt13runtime_error }, comdat, align 8
|
|
@_ZTVN10__cxxabiv120__si_class_type_infoE = external global [0 x ptr]
|
|
@_ZTS3Foo = constant [5 x i8] c"3Foo\00"
|
|
@_ZTISt13runtime_error = external constant ptr
|
|
|
|
declare void @_ZN3FooD2Ev()
|
|
|
|
declare void @_ZN3FooD0Ev()
|
|
|
|
declare ptr @_ZNKSt13runtime_error4whatEv()
|
|
|
|
!llvm.module.flags = !{!6}
|
|
|
|
!0 = !{i64 16, !"_ZTS3Foo"}
|
|
!1 = !{i64 32, !"_ZTSM3FooKDoFPKcvE.virtual"}
|
|
!2 = !{i64 16, !"_ZTSSt13runtime_error"}
|
|
!3 = !{i64 32, !"_ZTSMSt13runtime_errorKDoFPKcvE.virtual"}
|
|
!4 = !{i64 16, !"_ZTSSt9exception"}
|
|
!5 = !{i64 32, !"_ZTSMSt9exceptionKDoFPKcvE.virtual"}
|
|
!6 = !{i32 1, !"EnableSplitLTOUnit", i32 1}
|