Skip to content

Commit 18b1fa8

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:455bf3d1ccd6 into amd-gfx:c7691189ce5b
Local branch amd-gfx c769118 Merged main:a5a2a5a3eca0 into amd-gfx:6731da8f7a30 Remote branch main 455bf3d [TextAPI] Consolidate TextAPI Reader/Writer APIs. (llvm#66108)
2 parents c769118 + 455bf3d commit 18b1fa8

File tree

494 files changed

+3967
-1717
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

494 files changed

+3967
-1717
lines changed

.github/new-prs-labeler.yml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ mlir:scf:
222222

223223
mlir:spirv:
224224
- mlir/**/SPIRV/**
225+
- mlir/**/SPIRVTo*/**
226+
- mlir/**/*ToSPIRV/**
227+
- mlir/tools/mlir-spirv-cpu-runner/**
228+
- mlir/tools/mlir-vulkan-runner/**
229+
- mlir/tools/mlir-tblgen/SPIRVUtilsGen.cpp
225230

226231
mlir:shape:
227232
- mlir/**/Shape/**
@@ -542,12 +547,12 @@ llvm:SelectionDAG:
542547
- llvm/include/llvm/CodeGen/ISDOpcodes.h
543548

544549
backend:DirectX:
545-
- llvm/lib/Target/DirectX/**
546-
- llvm/test/CodeGen/DirectX/**
547-
- llvm/tools/dxil-dis
548-
- llvm/test/tools/dxil-dis
549-
- clang/lib/Basic/Targets/DirectX*
550-
- llvm/include/llvm/IR/IntrinsicsDirectX.td
550+
- '**/*DirectX*'
551+
- '**/*DXIL*'
552+
- '**/*dxil*'
553+
- '**/*DirectX*/**'
554+
- '**/*DXIL*/**'
555+
- '**/*dxil*/**'
551556

552557
mlgo:
553558
- llvm/lib/Analysis/ML*

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2773,22 +2773,19 @@ void RewriteInstance::selectFunctionsToProcess() {
27732773
return true;
27742774

27752775
// Non-regex check (-funcs-no-regex and -funcs-file-no-regex).
2776-
std::optional<StringRef> Match =
2777-
Function.forEachName([&ForceFunctionsNR](StringRef Name) {
2778-
return ForceFunctionsNR.count(Name.str());
2779-
});
2780-
return Match.has_value();
2776+
for (const StringRef Name : Function.getNames())
2777+
if (ForceFunctionsNR.count(Name.str()))
2778+
return true;
2779+
2780+
return false;
27812781
}
27822782

27832783
if (opts::Lite) {
27842784
// Forcibly include functions specified in the -function-order file.
27852785
if (opts::ReorderFunctions == ReorderFunctions::RT_USER) {
2786-
std::optional<StringRef> Match =
2787-
Function.forEachName([&](StringRef Name) {
2788-
return ReorderFunctionsUserSet.contains(Name);
2789-
});
2790-
if (Match.has_value())
2791-
return true;
2786+
for (const StringRef Name : Function.getNames())
2787+
if (ReorderFunctionsUserSet.contains(Name))
2788+
return true;
27922789
for (const StringRef Name : Function.getNames())
27932790
if (std::optional<StringRef> LTOCommonName = getLTOCommonName(Name))
27942791
if (ReorderFunctionsLTOCommonSet.contains(*LTOCommonName))

clang/include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,9 @@ def err_cc1_round_trip_mismatch : Error<
674674
def err_cc1_unbounded_vscale_min : Error<
675675
"minimum vscale must be an unsigned integer greater than 0">;
676676

677+
def err_drv_using_omit_rtti_component_without_no_rtti : Error<
678+
"-fexperimental-omit-vtable-rtti call only be used with -fno-rtti">;
679+
677680
def err_drv_ssp_missing_offset_argument : Error<
678681
"'%0' is used without '-mstack-protector-guard-offset', and there is no default">;
679682

clang/include/clang/Basic/LangOptions.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,9 @@ LANGOPT(SpeculativeLoadHardening, 1, 0, "Speculative load hardening enabled")
450450
LANGOPT(RelativeCXXABIVTables, 1, 0,
451451
"Use an ABI-incompatible v-table layout that uses relative references")
452452

453+
LANGOPT(OmitVTableRTTI, 1, 0,
454+
"Use an ABI-incompatible v-table layout that omits the RTTI component")
455+
453456
LANGOPT(VScaleMin, 32, 0, "Minimum vscale value")
454457
LANGOPT(VScaleMax, 32, 0, "Maximum vscale value")
455458

clang/include/clang/Driver/Options.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2671,6 +2671,12 @@ def fno_experimental_relative_cxx_abi_vtables :
26712671
Group<f_clang_Group>, Visibility<[ClangOption, CC1Option]>,
26722672
HelpText<"Do not use the experimental C++ class ABI for classes with virtual tables">;
26732673

2674+
defm experimental_omit_vtable_rtti : BoolFOption<"experimental-omit-vtable-rtti",
2675+
LangOpts<"OmitVTableRTTI">, DefaultFalse,
2676+
PosFlag<SetTrue, [], [CC1Option], "Omit">,
2677+
NegFlag<SetFalse, [], [CC1Option], "Do not omit">,
2678+
BothFlags<[], [CC1Option], " the RTTI component from virtual tables">>;
2679+
26742680
def fcxx_abi_EQ : Joined<["-"], "fc++-abi=">,
26752681
Group<f_clang_Group>, Visibility<[ClangOption, CC1Option]>,
26762682
HelpText<"C++ ABI to use. This will override the target C++ ABI.">;

clang/lib/AST/VTableBuilder.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,11 @@ CharUnits VCallAndVBaseOffsetBuilder::getCurrentOffsetOffset() const {
665665
// vtable address point. (We subtract 3 to account for the information just
666666
// above the address point, the RTTI info, the offset to top, and the
667667
// vcall offset itself).
668-
int64_t OffsetIndex = -(int64_t)(3 + Components.size());
668+
size_t NumComponentsAboveAddrPoint = 3;
669+
if (Context.getLangOpts().OmitVTableRTTI)
670+
NumComponentsAboveAddrPoint--;
671+
int64_t OffsetIndex =
672+
-(int64_t)(NumComponentsAboveAddrPoint + Components.size());
669673

670674
// Under the relative ABI, the offset widths are 32-bit ints instead of
671675
// pointer widths.
@@ -1669,7 +1673,8 @@ void ItaniumVTableBuilder::LayoutPrimaryAndSecondaryVTables(
16691673
Components.push_back(VTableComponent::MakeOffsetToTop(OffsetToTop));
16701674

16711675
// Next, add the RTTI.
1672-
Components.push_back(VTableComponent::MakeRTTI(MostDerivedClass));
1676+
if (!Context.getLangOpts().OmitVTableRTTI)
1677+
Components.push_back(VTableComponent::MakeRTTI(MostDerivedClass));
16731678

16741679
uint64_t AddressPoint = Components.size();
16751680

clang/lib/Analysis/FlowSensitive/Transfer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,13 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> {
531531
auto *LocDst =
532532
cast_or_null<RecordStorageLocation>(Env.getStorageLocation(*Arg0));
533533

534+
// The assignment operators are different from the type of the destination
535+
// in this model (i.e. in one of their base classes). This must be very rare
536+
// and we just bail.
537+
if (Method->getThisObjectType().getCanonicalType().getUnqualifiedType() !=
538+
LocDst->getType().getCanonicalType().getUnqualifiedType())
539+
return;
540+
534541
if (LocSrc != nullptr && LocDst != nullptr) {
535542
copyRecord(*LocSrc, *LocDst, Env);
536543
Env.setStorageLocation(*S, *LocDst);

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,12 @@ getCodeModel(const CodeGenOptions &CodeGenOpts) {
314314

315315
static CodeGenFileType getCodeGenFileType(BackendAction Action) {
316316
if (Action == Backend_EmitObj)
317-
return CGFT_ObjectFile;
317+
return CodeGenFileType::ObjectFile;
318318
else if (Action == Backend_EmitMCNull)
319-
return CGFT_Null;
319+
return CodeGenFileType::Null;
320320
else {
321321
assert(Action == Backend_EmitAssembly && "Invalid action!");
322-
return CGFT_AssemblyFile;
322+
return CodeGenFileType::AssemblyFile;
323323
}
324324
}
325325

@@ -561,10 +561,10 @@ void EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
561561
std::string FeaturesStr =
562562
llvm::join(TargetOpts.Features.begin(), TargetOpts.Features.end(), ",");
563563
llvm::Reloc::Model RM = CodeGenOpts.RelocationModel;
564-
std::optional<CodeGenOpt::Level> OptLevelOrNone =
564+
std::optional<CodeGenOptLevel> OptLevelOrNone =
565565
CodeGenOpt::getLevel(CodeGenOpts.OptimizationLevel);
566566
assert(OptLevelOrNone && "Invalid optimization level!");
567-
CodeGenOpt::Level OptLevel = *OptLevelOrNone;
567+
CodeGenOptLevel OptLevel = *OptLevelOrNone;
568568

569569
llvm::TargetOptions Options;
570570
if (!initTargetOptions(Diags, Options, CodeGenOpts, TargetOpts, LangOpts,
@@ -1216,7 +1216,7 @@ static void runThinLTOBackend(
12161216
Conf.CodeModel = getCodeModel(CGOpts);
12171217
Conf.MAttrs = TOpts.Features;
12181218
Conf.RelocModel = CGOpts.RelocationModel;
1219-
std::optional<CodeGenOpt::Level> OptLevelOrNone =
1219+
std::optional<CodeGenOptLevel> OptLevelOrNone =
12201220
CodeGenOpt::getLevel(CGOpts.OptimizationLevel);
12211221
assert(OptLevelOrNone && "Invalid optimization level!");
12221222
Conf.CGOptLevel = *OptLevelOrNone;

clang/lib/CodeGen/CGCUDANV.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1234,7 +1234,10 @@ llvm::GlobalValue *CGNVCUDARuntime::getKernelHandle(llvm::Function *F,
12341234
Var->setAlignment(CGM.getPointerAlign().getAsAlign());
12351235
Var->setDSOLocal(F->isDSOLocal());
12361236
Var->setVisibility(F->getVisibility());
1237-
CGM.maybeSetTrivialComdat(*GD.getDecl(), *Var);
1237+
auto *FD = cast<FunctionDecl>(GD.getDecl());
1238+
auto *FT = FD->getPrimaryTemplate();
1239+
if (!FT || FT->isThisDeclarationADefinition())
1240+
CGM.maybeSetTrivialComdat(*FD, *Var);
12381241
KernelHandles[F->getName()] = Var;
12391242
KernelStubs[Var] = F;
12401243
return Var;

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5526,6 +5526,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
55265526
Args.AddLastArg(CmdArgs, options::OPT_fexperimental_relative_cxx_abi_vtables,
55275527
options::OPT_fno_experimental_relative_cxx_abi_vtables);
55285528

5529+
Args.AddLastArg(CmdArgs, options::OPT_fexperimental_omit_vtable_rtti,
5530+
options::OPT_fno_experimental_omit_vtable_rtti);
5531+
55295532
// Handle segmented stacks.
55305533
Args.addOptInFlag(CmdArgs, options::OPT_fsplit_stack,
55315534
options::OPT_fno_split_stack);
@@ -6007,6 +6010,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
60076010
Args.AddLastArg(CmdArgs, options::OPT_fexperimental_relative_cxx_abi_vtables,
60086011
options::OPT_fno_experimental_relative_cxx_abi_vtables);
60096012

6013+
Args.AddLastArg(CmdArgs, options::OPT_fexperimental_omit_vtable_rtti,
6014+
options::OPT_fno_experimental_omit_vtable_rtti);
6015+
60106016
if (Arg *A = Args.getLastArg(options::OPT_ffuchsia_api_level_EQ))
60116017
A->render(Args, CmdArgs);
60126018

clang/lib/Driver/ToolChains/DragonFly.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,9 @@ void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
123123

124124
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
125125
options::OPT_r)) {
126-
CmdArgs.push_back("-L/usr/lib/gcc80");
126+
SmallString<128> Dir(D.SysRoot);
127+
llvm::sys::path::append(Dir, "/usr/lib/gcc80");
128+
CmdArgs.push_back(Args.MakeArgString("-L" + Dir));
127129

128130
if (!Args.hasArg(options::OPT_static)) {
129131
CmdArgs.push_back("-rpath");
@@ -192,8 +194,8 @@ DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
192194
getProgramPaths().push_back(getDriver().Dir);
193195

194196
getFilePaths().push_back(getDriver().Dir + "/../lib");
195-
getFilePaths().push_back("/usr/lib");
196-
getFilePaths().push_back("/usr/lib/gcc80");
197+
getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib"));
198+
getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/gcc80"));
197199
}
198200

199201
void DragonFly::AddClangSystemIncludeArgs(

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -661,27 +661,27 @@ static bool FixupInvocation(CompilerInvocation &Invocation,
661661

662662
static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,
663663
DiagnosticsEngine &Diags) {
664-
unsigned DefaultOpt = llvm::CodeGenOpt::None;
664+
unsigned DefaultOpt = 0;
665665
if ((IK.getLanguage() == Language::OpenCL ||
666666
IK.getLanguage() == Language::OpenCLCXX) &&
667667
!Args.hasArg(OPT_cl_opt_disable))
668-
DefaultOpt = llvm::CodeGenOpt::Default;
668+
DefaultOpt = 2;
669669

670670
if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
671671
if (A->getOption().matches(options::OPT_O0))
672-
return llvm::CodeGenOpt::None;
672+
return 0;
673673

674674
if (A->getOption().matches(options::OPT_Ofast))
675-
return llvm::CodeGenOpt::Aggressive;
675+
return 3;
676676

677677
assert(A->getOption().matches(options::OPT_O));
678678

679679
StringRef S(A->getValue());
680680
if (S == "s" || S == "z")
681-
return llvm::CodeGenOpt::Default;
681+
return 2;
682682

683683
if (S == "g")
684-
return llvm::CodeGenOpt::Less;
684+
return 1;
685685

686686
return getLastArgIntValue(Args, OPT_O, DefaultOpt, Diags);
687687
}
@@ -4109,6 +4109,14 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
41094109
options::OPT_fno_experimental_relative_cxx_abi_vtables,
41104110
TargetCXXABI::usesRelativeVTables(T));
41114111

4112+
// RTTI is on by default.
4113+
bool HasRTTI = Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti, true);
4114+
Opts.OmitVTableRTTI =
4115+
Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4116+
options::OPT_fno_experimental_omit_vtable_rtti, false);
4117+
if (Opts.OmitVTableRTTI && HasRTTI)
4118+
Diags.Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4119+
41124120
for (const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
41134121
auto Split = StringRef(A).split('=');
41144122
Opts.MacroPrefixMap.insert(

clang/lib/Interpreter/DeviceOffload.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ llvm::Expected<llvm::StringRef> IncrementalCUDADeviceParser::GeneratePTX() {
8888

8989
llvm::legacy::PassManager PM;
9090
if (TargetMachine->addPassesToEmitFile(PM, dest, nullptr,
91-
llvm::CGFT_AssemblyFile)) {
91+
llvm::CodeGenFileType::AssemblyFile)) {
9292
return llvm::make_error<llvm::StringError>(
9393
"NVPTX backend cannot produce PTX code.",
9494
llvm::inconvertibleErrorCode());

clang/test/CodeGenCUDA/kernel-stub-name.cu

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@
2626
// GNU: @[[HNSKERN:_ZN2ns8nskernelEv]] = constant ptr @[[NSSTUB:_ZN2ns23__device_stub__nskernelEv]], align 8
2727
// GNU: @[[HTKERN:_Z10kernelfuncIiEvv]] = linkonce_odr constant ptr @[[TSTUB:_Z25__device_stub__kernelfuncIiEvv]], comdat, align 8
2828
// GNU: @[[HDKERN:_Z11kernel_declv]] = external constant ptr, align 8
29+
// GNU: @[[HTDKERN:_Z20template_kernel_declIiEvT_]] = external constant ptr, align 8
2930

3031
// MSVC: @[[HCKERN:ckernel]] = dso_local constant ptr @[[CSTUB:__device_stub__ckernel]], align 8
3132
// MSVC: @[[HNSKERN:"\?nskernel@ns@@YAXXZ.*"]] = dso_local constant ptr @[[NSSTUB:"\?__device_stub__nskernel@ns@@YAXXZ"]], align 8
3233
// MSVC: @[[HTKERN:"\?\?\$kernelfunc@H@@YAXXZ.*"]] = linkonce_odr dso_local constant ptr @[[TSTUB:"\?\?\$__device_stub__kernelfunc@H@@YAXXZ.*"]], comdat, align 8
3334
// MSVC: @[[HDKERN:"\?kernel_decl@@YAXXZ.*"]] = external dso_local constant ptr, align 8
34-
35+
// MSVC: @[[HTDKERN:"\?\?\$template_kernel_decl@H@@YAXH.*"]] = external dso_local constant ptr, align 8
3536
extern "C" __global__ void ckernel() {}
3637

3738
namespace ns {
@@ -43,6 +44,9 @@ __global__ void kernelfunc() {}
4344

4445
__global__ void kernel_decl();
4546

47+
template<class T>
48+
__global__ void template_kernel_decl(T x);
49+
4650
extern "C" void (*kernel_ptr)();
4751
extern "C" void *void_ptr;
4852

@@ -69,13 +73,16 @@ extern "C" void launch(void *kern);
6973
// CHECK: call void @[[NSSTUB]]()
7074
// CHECK: call void @[[TSTUB]]()
7175
// GNU: call void @[[DSTUB:_Z26__device_stub__kernel_declv]]()
76+
// GNU: call void @[[TDSTUB:_Z35__device_stub__template_kernel_declIiEvT_]](
7277
// MSVC: call void @[[DSTUB:"\?__device_stub__kernel_decl@@YAXXZ"]]()
78+
// MSVC: call void @[[TDSTUB:"\?\?\$__device_stub__template_kernel_decl@H@@YAXH@Z"]](
7379

7480
extern "C" void fun1(void) {
7581
ckernel<<<1, 1>>>();
7682
ns::nskernel<<<1, 1>>>();
7783
kernelfunc<int><<<1, 1>>>();
7884
kernel_decl<<<1, 1>>>();
85+
template_kernel_decl<<<1, 1>>>(1);
7986
}
8087

8188
// Template kernel stub functions
@@ -86,6 +93,7 @@ extern "C" void fun1(void) {
8693
// Check declaration of stub function for external kernel.
8794

8895
// CHECK: declare{{.*}}@[[DSTUB]]
96+
// CHECK: declare{{.*}}@[[TDSTUB]]
8997

9098
// Check kernel handle is used for passing the kernel as a function pointer.
9199

@@ -94,11 +102,13 @@ extern "C" void fun1(void) {
94102
// CHECK: call void @launch({{.*}}[[HNSKERN]]
95103
// CHECK: call void @launch({{.*}}[[HTKERN]]
96104
// CHECK: call void @launch({{.*}}[[HDKERN]]
105+
// CHECK: call void @launch({{.*}}[[HTDKERN]]
97106
extern "C" void fun2() {
98107
launch((void *)ckernel);
99108
launch((void *)ns::nskernel);
100109
launch((void *)kernelfunc<int>);
101110
launch((void *)kernel_decl);
111+
launch((void *)template_kernel_decl<int>);
102112
}
103113

104114
// Check kernel handle is used for assigning a kernel to a function pointer.
@@ -148,3 +158,4 @@ extern "C" void fun5() {
148158
// CHECK: call{{.*}}@__hipRegisterFunction{{.*}}@[[HTKERN]]{{.*}}@[[TKERN]]
149159
// NEG-NOT: call{{.*}}@__hipRegisterFunction{{.*}}__device_stub
150160
// NEG-NOT: call{{.*}}@__hipRegisterFunction{{.*}}kernel_decl
161+
// NEG-NOT: call{{.*}}@__hipRegisterFunction{{.*}}template_kernel_decl
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/// Check that -fexperimental-omit-vtable-rtti omits the RTTI component from
2+
/// the vtable.
3+
4+
// RUN: %clang_cc1 %s -triple=aarch64-unknown-linux-gnu -fno-rtti -fexperimental-omit-vtable-rtti -S -o - -emit-llvm | FileCheck -check-prefixes=POINTER,RTTI %s
5+
// RUN: %clang_cc1 %s -triple=aarch64-unknown-linux-gnu -fexperimental-relative-c++-abi-vtables -fno-rtti -fexperimental-omit-vtable-rtti -S -o - -emit-llvm | FileCheck -check-prefixes=RELATIVE,RTTI %s
6+
7+
/// Normally, the vtable would contain at least three components:
8+
/// - An offset to top
9+
/// - A pointer to the RTTI struct
10+
/// - A virtual function
11+
///
12+
/// Now vtables should have just two components.
13+
// POINTER: @_ZTV1A = unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr null, ptr @_ZN1A3fooEv] }, align 8
14+
// RELATIVE: @_ZTV1A.local = private unnamed_addr constant { [2 x i32] } { [2 x i32] [i32 0, i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @_ZN1A3fooEv to i64), i64 ptrtoint (ptr getelementptr inbounds ({ [2 x i32] }, ptr @_ZTV1A.local, i32 0, i32 0, i32 1) to i64)) to i32)] }, align 4
15+
// RELATIVE: @_ZTV1A = unnamed_addr alias { [2 x i32] }, ptr @_ZTV1A.local
16+
17+
/// None of these supplementary symbols should be emitted with -fno-rtti, but
18+
/// as a sanity check lets make sure they're not emitted also.
19+
// RTTI-NOT: @_ZTVN10__cxxabiv117__class_type_infoE
20+
// RTTI-NOT: @_ZTS1A
21+
// RTTI-NOT: @_ZTI1A
22+
23+
class A {
24+
public:
25+
virtual void foo();
26+
};
27+
28+
void A::foo() {}
29+
30+
void A_foo(A *a) {
31+
a->foo();
32+
}

0 commit comments

Comments
 (0)