Skip to content

Commit ee7db99

Browse files
committed
[CIR] Add a flag to disable CIR emission for default cxx methods
This allows us to test analysis without having to CIR codegen compiler generated code.
1 parent 7ba6541 commit ee7db99

File tree

5 files changed

+21
-3
lines changed

5 files changed

+21
-3
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2177,6 +2177,10 @@ def clangir_disable_verifier : Flag<["-"], "clangir-disable-verifier">,
21772177
Flags<[CoreOption, CC1Option]>,
21782178
HelpText<"ClangIR: Disable MLIR module verifier">,
21792179
MarshallingInfoFlag<FrontendOpts<"ClangIRDisableCIRVerifier">>;
2180+
def clangir_disable_emit_cxx_default : Flag<["-"], "clangir-disable-emit-cxx-default">,
2181+
Flags<[CoreOption, CC1Option]>,
2182+
HelpText<"ClangIR: Disable emission of c++ default (compiler implemented) methods.">,
2183+
MarshallingInfoFlag<FrontendOpts<"ClangIRDisableEmitCXXDefault">>;
21802184
def clangir_verify_diagnostics : Flag<["-"], "clangir-verify-diagnostics">,
21812185
Flags<[CoreOption, CC1Option]>,
21822186
HelpText<"ClangIR: Enable diagnostic verification in MLIR, similar to clang's -verify">,

clang/include/clang/Frontend/FrontendOptions.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,9 @@ class FrontendOptions {
361361
/// Disable Clang IR (CIR) verifier
362362
unsigned ClangIRDisableCIRVerifier : 1;
363363

364+
/// Disable ClangIR emission for CXX default (compiler generated methods).
365+
unsigned ClangIRDisableEmitCXXDefault : 1;
366+
364367
/// Enable diagnostic verification for CIR
365368
unsigned ClangIRVerifyDiags : 1;
366369

@@ -537,8 +540,8 @@ class FrontendOptions {
537540
IncludeTimestamps(true), UseTemporary(true),
538541
AllowPCMWithCompilerErrors(false), ModulesShareFileManager(true),
539542
UseClangIRPipeline(false), ClangIRDisablePasses(false),
540-
ClangIRDisableCIRVerifier(false), ClangIRLifetimeCheck(false),
541-
TimeTraceGranularity(500) {}
543+
ClangIRDisableCIRVerifier(false), ClangIRDisableEmitCXXDefault(false),
544+
ClangIRLifetimeCheck(false), TimeTraceGranularity(500) {}
542545

543546
/// getInputKindForExtension - Return the appropriate input kind for a file
544547
/// extension. For example, "c" would return Language::C.

clang/lib/CIR/FrontendAction/CIRGenAction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ class CIRGenConsumer : public clang::ASTConsumer {
214214
}
215215

216216
// Emit remaining defaulted C++ methods
217-
gen->buildDefaultMethods();
217+
if (!feOptions.ClangIRDisableEmitCXXDefault)
218+
gen->buildDefaultMethods();
218219

219220
// FIXME: we cannot roundtrip prettyForm=true right now.
220221
mlir::OpPrintingFlags flags;

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2821,6 +2821,9 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
28212821
if (Args.hasArg(OPT_clangir_disable_verifier))
28222822
Opts.ClangIRDisableCIRVerifier = true;
28232823

2824+
if (Args.hasArg(OPT_clangir_disable_emit_cxx_default))
2825+
Opts.ClangIRDisableEmitCXXDefault = true;
2826+
28242827
if (Args.hasArg(OPT_clangir_verify_diagnostics))
28252828
Opts.ClangIRVerifyDiags = true;
28262829

clang/test/CIR/CodeGen/assign-operator.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 -std=c++17 -mconstructor-aliases -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-cir %s -o - | FileCheck %s
2+
// RUN: %clang_cc1 -std=c++17 -mconstructor-aliases -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-cir -clangir-disable-emit-cxx-default %s -o - | FileCheck %s --check-prefix=DISABLE
23

34
int strlen(char const *);
45

@@ -24,6 +25,9 @@ struct String {
2425
// CHECK: cir.return
2526
// CHECK: }
2627

28+
// DISABLE: cir.func linkonce_odr @_ZN10StringViewC2ERK6String
29+
// DISABLE-NEXT: %0 = cir.alloca !cir.ptr<!22struct2EStringView22>, cir.ptr <!cir.ptr<!22struct2EStringView22>>, ["this", init] {alignment = 8 : i64}
30+
2731
// StringView::operator=(StringView&&)
2832
//
2933
// CHECK: cir.func linkonce_odr @_ZN10StringViewaSEOS_
@@ -42,6 +46,9 @@ struct String {
4246
// CHECK: %8 = cir.load %2 : cir.ptr <!cir.ptr<!22struct2EStringView22>>
4347
// CHECK: cir.return %8 : !cir.ptr<!22struct2EStringView22>
4448
// CHECK: }
49+
50+
// DISABLE: cir.func @_ZN10StringViewaSEOS_
51+
// DISABLE-NEXT: cir.func @main()
4552
};
4653

4754
struct StringView {

0 commit comments

Comments
 (0)