[Clang] Emit type metadata on vtables when IRPGO instrumentation option is on. (#70841)
The motivating use case is to have type metadata on vtables if IR instrumentation is on (without the requirement of`-fwhole-program-vtables` or `-flto`). A related rfc is in https://discourse.llvm.org/t/rfc-dynamic-type-profiling-and-optimizations-in-llvm/74600
This commit is contained in:
parent
c7a7a43dbb
commit
34c0d32c81
@ -1312,7 +1312,10 @@ llvm::GlobalObject::VCallVisibility CodeGenModule::GetVCallVisibilityLevel(
|
||||
void CodeGenModule::EmitVTableTypeMetadata(const CXXRecordDecl *RD,
|
||||
llvm::GlobalVariable *VTable,
|
||||
const VTableLayout &VTLayout) {
|
||||
if (!getCodeGenOpts().LTOUnit)
|
||||
// Emit type metadata on vtables with LTO or IR instrumentation.
|
||||
// In IR instrumentation, the type metadata is used to find out vtable
|
||||
// definitions (for type profiling) among all global variables.
|
||||
if (!getCodeGenOpts().LTOUnit && !getCodeGenOpts().hasProfileIRInstr())
|
||||
return;
|
||||
|
||||
CharUnits ComponentWidth = GetTargetTypeStoreSize(getVTableComponentType());
|
||||
|
||||
@ -1673,7 +1673,11 @@ void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
|
||||
void MicrosoftCXXABI::emitVTableTypeMetadata(const VPtrInfo &Info,
|
||||
const CXXRecordDecl *RD,
|
||||
llvm::GlobalVariable *VTable) {
|
||||
if (!CGM.getCodeGenOpts().LTOUnit)
|
||||
// Emit type metadata on vtables with LTO or IR instrumentation.
|
||||
// In IR instrumentation, the type metadata could be used to find out vtable
|
||||
// definitions (for type profiling) among all global variables.
|
||||
if (!CGM.getCodeGenOpts().LTOUnit &&
|
||||
!CGM.getCodeGenOpts().hasProfileIRInstr())
|
||||
return;
|
||||
|
||||
// TODO: Should VirtualFunctionElimination also be supported here?
|
||||
|
||||
@ -1,113 +1,133 @@
|
||||
// A meta comment on the prefixes:
|
||||
// ITANIUM-COMMON-MD prefix is common when the options are either non-relative vtable or relative vtables.
|
||||
// ITANIUM-NO-RV-MD prefix is used when the options specify non-relative vtables, and RV-MD is used when the options specify relative vtables.
|
||||
|
||||
// Tests for the cfi-vcall feature:
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=ITANIUM --check-prefix=ITANIUM-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=NDIAG %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=ITANIUM --check-prefix=ITANIUM-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-MD-DIAG --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=ITANIUM --check-prefix=ITANIUM-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-MD-DIAG --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=MS --check-prefix=TT-MS --check-prefix=NDIAG %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=ITANIUM-NO-RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=NDIAG %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=ITANIUM-NO-RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-NO-RV-MD-DIAG --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=ITANIUM-NO-RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-NO-RV-MD-DIAG --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT-NO-RV --check-prefix=MS --check-prefix=MS-TYPEMETADATA --check-prefix=TT-MS --check-prefix=NDIAG %s
|
||||
|
||||
// Tests for the whole-program-vtables feature:
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM --check-prefix=ITANIUM-MD --check-prefix=TT-ITANIUM-HIDDEN %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=ITANIUM-NO-RV-MD --check-prefix=TT-ITANIUM-HIDDEN %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM-DEFAULTVIS --check-prefix=TT-ITANIUM-DEFAULT %s
|
||||
// RUN: %clang_cc1 -O2 -flto -flto-unit -triple x86_64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=ITANIUM-OPT --check-prefix=ITANIUM-OPT-LAYOUT %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-pc-windows-msvc -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=MS --check-prefix=TT-MS %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-pc-windows-msvc -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=MS --check-prefix=MS-TYPEMETADATA --check-prefix=TT-MS %s
|
||||
|
||||
// Tests for cfi + whole-program-vtables:
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-VT --check-prefix=ITANIUM --check-prefix=TC-ITANIUM --check-prefix=ITANIUM-MD %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-VT --check-prefix=MS --check-prefix=TC-MS %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-VT --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=TC-ITANIUM --check-prefix=ITANIUM-NO-RV-MD %s
|
||||
// RUN: %clang_cc1 -flto -flto-unit -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-VT --check-prefix=MS --check-prefix=MS-TYPEMETADATA --check-prefix=TC-MS %s
|
||||
|
||||
// Equivalent tests for above, but with relative-vtables.
|
||||
// Tests for the cfi-vcall feature:
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT --check-prefix=RV-MD --check-prefix=ITANIUM --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=NDIAG --check-prefix=CFI-NVT-RV %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT --check-prefix=CFI-NVT-RV --check-prefix=ITANIUM --check-prefix=RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-DIAG --check-prefix=RV-MD-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT --check-prefix=CFI-NVT-RV --check-prefix=ITANIUM --check-prefix=RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-DIAG --check-prefix=RV-MD-DIAG --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT --check-prefix=RV-MD --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=NDIAG --check-prefix=CFI-NVT-RV %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT --check-prefix=CFI-NVT-RV --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-DIAG --check-prefix=RV-MD-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-NVT --check-prefix=CFI-NVT-RV --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=RV-MD --check-prefix=TT-ITANIUM-HIDDEN --check-prefix=ITANIUM-DIAG --check-prefix=RV-MD-DIAG --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s
|
||||
|
||||
// Tests for the whole-program-vtables feature:
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM -check-prefix=RV-MD --check-prefix=TT-ITANIUM-HIDDEN %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD -check-prefix=RV-MD --check-prefix=TT-ITANIUM-HIDDEN %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM-DEFAULTVIS --check-prefix=TT-ITANIUM-DEFAULT %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -O2 -flto -flto-unit -triple x86_64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=ITANIUM-OPT --check-prefix=RV-OPT-LAYOUT %s
|
||||
|
||||
// Tests for cfi + whole-program-vtables:
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-VT --check-prefix=ITANIUM --check-prefix=RV-MD --check-prefix=TC-ITANIUM %s
|
||||
// RUN: %clang_cc1 -fexperimental-relative-c++-abi-vtables -flto -flto-unit -triple x86_64-unknown-linux -fvisibility=hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=CFI-VT --check-prefix=ITANIUM-HIDDEN --check-prefix=ITANIUM-COMMON-MD --check-prefix=RV-MD --check-prefix=TC-ITANIUM %s
|
||||
|
||||
// ITANIUM: @_ZTV1A = {{[^!]*}}, !type [[A16:![0-9]+]]
|
||||
// Tests that type metadata are annotated on vtables with `-profile-instrument=llvm` (which is equivalent to clang driver option `-fprofile-generate` without `-fcs-profile-generate`):
|
||||
// - In clang driver, `-fprofile-instrument` cc1 option is set to 'llvm' iff clang driver option `-fprofile-generate{,=}` is taking effect.
|
||||
// RUN: %clang_cc1 -fprofile-instrument=llvm -fno-lto -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --check-prefix=ITANIUM-COMMON-MD
|
||||
// RUN: %clang_cc1 -fprofile-instrument=llvm -fno-lto -triple x86_64-pc-windows-msvc -emit-llvm %s -o - | FileCheck %s --check-prefix=MS-TYPEMETADATA
|
||||
|
||||
// Tests type metadata are not annotated on vtables if `-fno-lto` is specified and `-fprofile-instrument` is any of {none, clang, csllvm}.
|
||||
// This is mainly for test coverage; there isn't a fundamental reason type metadata couldn't be annotated with those options.
|
||||
|
||||
// RUN: %clang_cc1 -fprofile-instrument=none -fno-lto -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="!type"
|
||||
// RUN: %clang_cc1 -fprofile-instrument=clang -fno-lto -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="!type"
|
||||
// RUN: %clang_cc1 -fprofile-instrument=csllvm -fno-lto -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="!type"
|
||||
|
||||
// RUN: %clang_cc1 -fprofile-instrument=none -fno-lto -triple x86_64-pc-windows-msvc -emit-llvm %s -o - | FileCheck %s --implicit-check-not="!type"
|
||||
// RUN: %clang_cc1 -fprofile-instrument=clang -fno-lto -triple x86_64-pc-windows-msvc -emit-llvm %s -o - | FileCheck %s --implicit-check-not="!type"
|
||||
// RUN: %clang_cc1 -fprofile-instrument=csllvm -fno-lto -triple x86_64-pc-windows-msvc -emit-llvm %s -o - | FileCheck %s --implicit-check-not="!type"
|
||||
|
||||
// ITANIUM-COMMON-MD: @_ZTV1A = {{[^!]*}}, !type [[A16:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL16:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[AF16:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF16:![0-9]+]]
|
||||
|
||||
// ITANIUM: @_ZTV1B = {{[^!]*}}, !type [[A32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD: @_ZTV1B = {{[^!]*}}, !type [[A32:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[AF32:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[AF40:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[AF48:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[B32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF40:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF48:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[B32:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[BF32:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[BF40:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[BF48:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[BF32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[BF40:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[BF48:![0-9]+]]
|
||||
|
||||
// ITANIUM: @_ZTV1C = {{[^!]*}}, !type [[A32]]
|
||||
// ITANIUM-COMMON-MD: @_ZTV1C = {{[^!]*}}, !type [[A32]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[AF32]]
|
||||
// ITANIUM-SAME: !type [[C32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[C32:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[CF32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[CF32:![0-9]+]]
|
||||
|
||||
// DIAG: @[[SRC:.*]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*}}type-metadata.cpp\00", align 1
|
||||
// DIAG: @[[TYPE:.*]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'A'\00" }
|
||||
// DIAG: @[[BADTYPESTATIC:.*]] = private unnamed_addr global { i8, { ptr, i32, i32 }, ptr } { i8 0, { ptr, i32, i32 } { ptr @[[SRC]], i32 123, i32 3 }, ptr @[[TYPE]] }
|
||||
|
||||
// ITANIUM: @_ZTVN12_GLOBAL__N_11DE = {{[^!]*}}, !type [[A32]]
|
||||
// ITANIUM-COMMON-MD: @_ZTVN12_GLOBAL__N_11DE = {{[^!]*}}, !type [[A32]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[AF32]]
|
||||
// ITANIUM-SAME: !type [[AF40]]
|
||||
// ITANIUM-SAME: !type [[AF48]]
|
||||
// ITANIUM-SAME: !type [[B32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF40]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF48]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[B32]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[BF32]]
|
||||
// ITANIUM-SAME: !type [[BF40]]
|
||||
// ITANIUM-SAME: !type [[BF48]]
|
||||
// ITANIUM-SAME: !type [[C88:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[BF32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[BF40]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[BF48]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[C88:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL88:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[CF32]]
|
||||
// ITANIUM-SAME: !type [[CF40:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[CF48:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[D32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[CF32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[CF40:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[CF48:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[D32:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[DF32:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[DF40:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[DF48:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[DF32:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[DF40:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[DF48:![0-9]+]]
|
||||
|
||||
// ITANIUM: @_ZTCN12_GLOBAL__N_11DE0_1B = {{[^!]*}}, !type [[A32]]
|
||||
// ITANIUM-COMMON-MD: @_ZTCN12_GLOBAL__N_11DE0_1B = {{[^!]*}}, !type [[A32]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[B32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[B32]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
|
||||
// ITANIUM: @_ZTCN12_GLOBAL__N_11DE8_1C = {{[^!]*}}, !type [[A64:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD: @_ZTCN12_GLOBAL__N_11DE8_1C = {{[^!]*}}, !type [[A64:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL64:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[AF64:![0-9]+]]
|
||||
// ITANIUM-SAME: !type [[C32]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF64:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[C32]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL32]]
|
||||
// ITANIUM-SAME: !type [[CF64:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[CF64:![0-9]+]]
|
||||
|
||||
// ITANIUM: @_ZTVZ3foovE2FA = {{[^!]*}}, !type [[A16]]
|
||||
// ITANIUM-COMMON-MD: @_ZTVZ3foovE2FA = {{[^!]*}}, !type [[A16]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL16]]
|
||||
// ITANIUM-SAME: !type [[AF16]]
|
||||
// ITANIUM-SAME: !type [[FA16:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[AF16]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[FA16:![0-9]+]]
|
||||
// ITANIUM-DIAG-SAME: !type [[ALL16]]
|
||||
// ITANIUM-SAME: !type [[FAF16:![0-9]+]]
|
||||
// ITANIUM-COMMON-MD-SAME: !type [[FAF16:![0-9]+]]
|
||||
|
||||
// ITANIUM: @_ZTVN5test31EE = external unnamed_addr constant
|
||||
// ITANIUM-COMMON-MD: @_ZTVN5test31EE = external unnamed_addr constant
|
||||
// ITANIUM-DEFAULTVIS: @_ZTVN5test31EE = external unnamed_addr constant
|
||||
// ITANIUM-OPT: @_ZTVN5test31EE = available_externally unnamed_addr constant {{[^!]*}},
|
||||
// ITANIUM-OPT-SAME: !type [[E16:![0-9]+]],
|
||||
// ITANIUM-OPT-SAME: !type [[EF16:![0-9]+]]
|
||||
// ITANIUM-OPT: @llvm.compiler.used = appending global [1 x ptr] [ptr @_ZTVN5test31EE]
|
||||
|
||||
// MS: comdat($"??_7A@@6B@"), !type [[A8:![0-9]+]]
|
||||
// MS: comdat($"??_7B@@6B0@@"), !type [[B8:![0-9]+]]
|
||||
// MS: comdat($"??_7B@@6BA@@@"), !type [[A8]]
|
||||
// MS: comdat($"??_7C@@6B@"), !type [[A8]]
|
||||
// MS: comdat($"??_7D@?A0x{{[^@]*}}@@6BB@@@"), !type [[B8]], !type [[D8:![0-9]+]]
|
||||
// MS: comdat($"??_7D@?A0x{{[^@]*}}@@6BA@@@"), !type [[A8]]
|
||||
// MS: comdat($"??_7FA@?1??foo@@YAXXZ@6B@"), !type [[A8]], !type [[FA8:![0-9]+]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7A@@6B@"), !type [[A8:![0-9]+]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7B@@6B0@@"), !type [[B8:![0-9]+]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7B@@6BA@@@"), !type [[A8]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7C@@6B@"), !type [[A8]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7D@?A0x{{[^@]*}}@@6BB@@@"), !type [[B8]], !type [[D8:![0-9]+]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7D@?A0x{{[^@]*}}@@6BA@@@"), !type [[A8]]
|
||||
// MS-TYPEMETADATA: comdat($"??_7FA@?1??foo@@YAXXZ@6B@"), !type [[A8]], !type [[FA8:![0-9]+]]
|
||||
|
||||
struct A {
|
||||
A();
|
||||
@ -151,7 +171,7 @@ void D::f() {
|
||||
void D::h() {
|
||||
}
|
||||
|
||||
// ITANIUM: define hidden void @_Z2afP1A
|
||||
// ITANIUM-HIDDEN: define hidden void @_Z2afP1A
|
||||
// ITANIUM-DEFAULTVIS: define{{.*}} void @_Z2afP1A
|
||||
// MS: define dso_local void @"?af@@YAXPEAUA@@@Z"
|
||||
void af(A *a) {
|
||||
@ -185,7 +205,7 @@ void af(A *a) {
|
||||
a->f();
|
||||
}
|
||||
|
||||
// ITANIUM: define internal void @_Z3df1PN12_GLOBAL__N_11DE
|
||||
// ITANIUM-HIDDEN: define internal void @_Z3df1PN12_GLOBAL__N_11DE
|
||||
// MS: define internal void @"?df1@@YAXPEAUD@?A0x{{[^@]*}}@@@Z"
|
||||
void df1(D *d) {
|
||||
// TT-ITANIUM-HIDDEN: {{%[^ ]*}} = call i1 @llvm.type.test(ptr {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]])
|
||||
@ -196,7 +216,7 @@ void df1(D *d) {
|
||||
d->f();
|
||||
}
|
||||
|
||||
// ITANIUM: define internal void @_Z3dg1PN12_GLOBAL__N_11DE
|
||||
// ITANIUM-HIDDEN: define internal void @_Z3dg1PN12_GLOBAL__N_11DE
|
||||
// MS: define internal void @"?dg1@@YAXPEAUD@?A0x{{[^@]*}}@@@Z"
|
||||
void dg1(D *d) {
|
||||
// TT-ITANIUM-HIDDEN: {{%[^ ]*}} = call i1 @llvm.type.test(ptr {{%[^ ]*}}, metadata !"_ZTS1B")
|
||||
@ -207,7 +227,7 @@ void dg1(D *d) {
|
||||
d->g();
|
||||
}
|
||||
|
||||
// ITANIUM: define internal void @_Z3dh1PN12_GLOBAL__N_11DE
|
||||
// ITANIUM-HIDDEN: define internal void @_Z3dh1PN12_GLOBAL__N_11DE
|
||||
// MS: define internal void @"?dh1@@YAXPEAUD@?A0x{{[^@]*}}@@@Z"
|
||||
void dh1(D *d) {
|
||||
// TT-ITANIUM-HIDDEN: {{%[^ ]*}} = call i1 @llvm.type.test(ptr {{%[^ ]*}}, metadata ![[DTYPE]])
|
||||
@ -218,7 +238,7 @@ void dh1(D *d) {
|
||||
d->h();
|
||||
}
|
||||
|
||||
// ITANIUM: define internal void @_Z3df2PN12_GLOBAL__N_11DE
|
||||
// ITANIUM-HIDDEN: define internal void @_Z3df2PN12_GLOBAL__N_11DE
|
||||
// MS: define internal void @"?df2@@YAXPEAUD@?A0x{{[^@]*}}@@@Z"
|
||||
__attribute__((no_sanitize("cfi")))
|
||||
void df2(D *d) {
|
||||
@ -228,7 +248,7 @@ void df2(D *d) {
|
||||
d->f();
|
||||
}
|
||||
|
||||
// ITANIUM: define internal void @_Z3df3PN12_GLOBAL__N_11DE
|
||||
// ITANIUM-HIDDEN: define internal void @_Z3df3PN12_GLOBAL__N_11DE
|
||||
// MS: define internal void @"?df3@@YAXPEAUD@?A0x{{[^@]*}}@@@Z"
|
||||
__attribute__((no_sanitize("address"))) __attribute__((no_sanitize("cfi-vcall")))
|
||||
void df3(D *d) {
|
||||
@ -266,7 +286,7 @@ struct D : C {
|
||||
void m_fn1();
|
||||
};
|
||||
|
||||
// ITANIUM: define hidden void @_ZN5test21fEPNS_1DE
|
||||
// ITANIUM-HIDDEN: define hidden void @_ZN5test21fEPNS_1DE
|
||||
// ITANIUM-DEFAULTVIS: define{{.*}} void @_ZN5test21fEPNS_1DE
|
||||
// MS: define dso_local void @"?f@test2@@YAXPEAUD@1@@Z"
|
||||
void f(D *d) {
|
||||
@ -327,38 +347,38 @@ void g() {
|
||||
// RV-MD: [[FAF16]] = !{i64 8, [[FAF_ID:![0-9]+]]}
|
||||
// RV-MD: [[FAF_ID]] = distinct !{}
|
||||
|
||||
// ITANIUM-MD: [[A16]] = !{i64 16, !"_ZTS1A"}
|
||||
// ITANIUM-MD-DIAG: [[ALL16]] = !{i64 16, !"all-vtables"}
|
||||
// ITANIUM-MD: [[AF16]] = !{i64 16, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-MD: [[A32]] = !{i64 32, !"_ZTS1A"}
|
||||
// ITANIUM-MD-DIAG: [[ALL32]] = !{i64 32, !"all-vtables"}
|
||||
// ITANIUM-MD: [[AF32]] = !{i64 32, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-MD: [[AF40]] = !{i64 40, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-MD: [[AF48]] = !{i64 48, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-MD: [[B32]] = !{i64 32, !"_ZTS1B"}
|
||||
// ITANIUM-MD: [[BF32]] = !{i64 32, !"_ZTSM1BFvvE.virtual"}
|
||||
// ITANIUM-MD: [[BF40]] = !{i64 40, !"_ZTSM1BFvvE.virtual"}
|
||||
// ITANIUM-MD: [[BF48]] = !{i64 48, !"_ZTSM1BFvvE.virtual"}
|
||||
// ITANIUM-MD: [[C32]] = !{i64 32, !"_ZTS1C"}
|
||||
// ITANIUM-MD: [[CF32]] = !{i64 32, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-MD: [[C88]] = !{i64 88, !"_ZTS1C"}
|
||||
// ITANIUM-MD-DIAG: [[ALL88]] = !{i64 88, !"all-vtables"}
|
||||
// ITANIUM-MD: [[CF40]] = !{i64 40, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-MD: [[CF48]] = !{i64 48, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-MD: [[D32]] = !{i64 32, [[D_ID:![0-9]+]]}
|
||||
// ITANIUM-MD: [[D_ID]] = distinct !{}
|
||||
// ITANIUM-MD: [[DF32]] = !{i64 32, [[DF_ID:![0-9]+]]}
|
||||
// ITANIUM-MD: [[DF_ID]] = distinct !{}
|
||||
// ITANIUM-MD: [[DF40]] = !{i64 40, [[DF_ID]]}
|
||||
// ITANIUM-MD: [[DF48]] = !{i64 48, [[DF_ID]]}
|
||||
// ITANIUM-MD: [[A64]] = !{i64 64, !"_ZTS1A"}
|
||||
// ITANIUM-MD-DIAG: [[ALL64]] = !{i64 64, !"all-vtables"}
|
||||
// ITANIUM-MD: [[AF64]] = !{i64 64, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-MD: [[CF64]] = !{i64 64, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-MD: [[FA16]] = !{i64 16, [[FA_ID:![0-9]+]]}
|
||||
// ITANIUM-MD: [[FA_ID]] = distinct !{}
|
||||
// ITANIUM-MD: [[FAF16]] = !{i64 16, [[FAF_ID:![0-9]+]]}
|
||||
// ITANIUM-MD: [[FAF_ID]] = distinct !{}
|
||||
// ITANIUM-NO-RV-MD: [[A16]] = !{i64 16, !"_ZTS1A"}
|
||||
// ITANIUM-NO-RV-MD-DIAG: [[ALL16]] = !{i64 16, !"all-vtables"}
|
||||
// ITANIUM-NO-RV-MD: [[AF16]] = !{i64 16, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[A32]] = !{i64 32, !"_ZTS1A"}
|
||||
// ITANIUM-NO-RV-MD-DIAG: [[ALL32]] = !{i64 32, !"all-vtables"}
|
||||
// ITANIUM-NO-RV-MD: [[AF32]] = !{i64 32, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[AF40]] = !{i64 40, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[AF48]] = !{i64 48, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[B32]] = !{i64 32, !"_ZTS1B"}
|
||||
// ITANIUM-NO-RV-MD: [[BF32]] = !{i64 32, !"_ZTSM1BFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[BF40]] = !{i64 40, !"_ZTSM1BFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[BF48]] = !{i64 48, !"_ZTSM1BFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[C32]] = !{i64 32, !"_ZTS1C"}
|
||||
// ITANIUM-NO-RV-MD: [[CF32]] = !{i64 32, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[C88]] = !{i64 88, !"_ZTS1C"}
|
||||
// ITANIUM-NO-RV-MD-DIAG: [[ALL88]] = !{i64 88, !"all-vtables"}
|
||||
// ITANIUM-NO-RV-MD: [[CF40]] = !{i64 40, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[CF48]] = !{i64 48, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[D32]] = !{i64 32, [[D_ID:![0-9]+]]}
|
||||
// ITANIUM-NO-RV-MD: [[D_ID]] = distinct !{}
|
||||
// ITANIUM-NO-RV-MD: [[DF32]] = !{i64 32, [[DF_ID:![0-9]+]]}
|
||||
// ITANIUM-NO-RV-MD: [[DF_ID]] = distinct !{}
|
||||
// ITANIUM-NO-RV-MD: [[DF40]] = !{i64 40, [[DF_ID]]}
|
||||
// ITANIUM-NO-RV-MD: [[DF48]] = !{i64 48, [[DF_ID]]}
|
||||
// ITANIUM-NO-RV-MD: [[A64]] = !{i64 64, !"_ZTS1A"}
|
||||
// ITANIUM-NO-RV-MD-DIAG: [[ALL64]] = !{i64 64, !"all-vtables"}
|
||||
// ITANIUM-NO-RV-MD: [[AF64]] = !{i64 64, !"_ZTSM1AFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[CF64]] = !{i64 64, !"_ZTSM1CFvvE.virtual"}
|
||||
// ITANIUM-NO-RV-MD: [[FA16]] = !{i64 16, [[FA_ID:![0-9]+]]}
|
||||
// ITANIUM-NO-RV-MD: [[FA_ID]] = distinct !{}
|
||||
// ITANIUM-NO-RV-MD: [[FAF16]] = !{i64 16, [[FAF_ID:![0-9]+]]}
|
||||
// ITANIUM-NO-RV-MD: [[FAF_ID]] = distinct !{}
|
||||
|
||||
// ITANIUM-OPT-LAYOUT: [[E16]] = !{i64 16, !"_ZTSN5test31EE"}
|
||||
// ITANIUM-OPT-LAYOUT: [[EF16]] = !{i64 16, !"_ZTSMN5test31EEFvvE.virtual"}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user