Author: Nikita Popov Date: 2022-04-05T10:15:41+02:00 New Revision: d69e9f9d8978399a9d1f1c1ed62aa661440afcd3
URL: https://github.com/llvm/llvm-project/commit/d69e9f9d8978399a9d1f1c1ed62aa661440afcd3 DIFF: https://github.com/llvm/llvm-project/commit/d69e9f9d8978399a9d1f1c1ed62aa661440afcd3.diff LOG: [OpaquePtrs][Clang] Add -opaque-pointers/-no-opaque-pointers cc1 options This adds cc1 options for enabling and disabling opaque pointers on the clang side. This is not super useful now (because -mllvm -opaque-pointers and -Xclang -opaque-pointers have the same visible effect) but will be important once opaque pointers are enabled by default in clang. In that case, it will only be possible to disable them using the cc1 -no-opaque-pointers option. Differential Revision: https://reviews.llvm.org/D123034 Added: clang/test/CodeGen/opaque-pointers-flag.c Modified: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/CodeGenAction.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 3301e7587d216..720a59ff1bdce 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -469,6 +469,9 @@ CODEGENOPT(SkipRaxSetup, 1, 0) ENUM_CODEGENOPT(ZeroCallUsedRegs, llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind, 5, llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip) +/// Whether to use opaque pointers. +CODEGENOPT(OpaquePointers, 1, 0) + #undef CODEGENOPT #undef ENUM_CODEGENOPT #undef VALUE_CODEGENOPT diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 2dc28bab08ca4..bc5aa1a37d0f2 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5504,6 +5504,13 @@ defm enable_noundef_analysis : BoolOption<"", PosFlag<SetTrue, [], "Enable">, NegFlag<SetFalse, [], "Disable">, BothFlags<[], " analyzing function argument and return types for mandatory definedness">>; +defm opaque_pointers : BoolOption<"", + "opaque-pointers", + CodeGenOpts<"OpaquePointers">, + DefaultFalse, + PosFlag<SetTrue, [], "Enable">, + NegFlag<SetFalse, [], "Disable">, + BothFlags<[], " opaque pointers">>; def discard_value_names : Flag<["-"], "discard-value-names">, HelpText<"Discard value names in LLVM IR">, MarshallingInfoFlag<CodeGenOpts<"DiscardValueNames">>; diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 807880fd4fd7a..25f4cbbc700a5 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -983,6 +983,9 @@ CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { if (BA != Backend_EmitNothing && !OS) return nullptr; + if (CI.getCodeGenOpts().OpaquePointers) + VMContext->enableOpaquePointers(); + // Load bitcode modules to link with, if we need to. if (LinkModules.empty()) for (const CodeGenOptions::BitcodeFileToLink &F : diff --git a/clang/test/CodeGen/opaque-pointers-flag.c b/clang/test/CodeGen/opaque-pointers-flag.c new file mode 100644 index 0000000000000..c4d4bb1619c2e --- /dev/null +++ b/clang/test/CodeGen/opaque-pointers-flag.c @@ -0,0 +1,27 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py +// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=TYPED +// RUN: %clang_cc1 -opaque-pointers -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=OPAQUE +// The current default is typed pointers: +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=TYPED + +// TYPED-LABEL: @test( +// TYPED-NEXT: entry: +// TYPED-NEXT: [[P_ADDR:%.*]] = alloca i32*, align 8 +// TYPED-NEXT: store i32* [[P:%.*]], i32** [[P_ADDR]], align 8 +// TYPED-NEXT: [[TMP0:%.*]] = load i32*, i32** [[P_ADDR]], align 8 +// TYPED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 1 +// TYPED-NEXT: [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 +// TYPED-NEXT: ret i32 [[TMP1]] +// +// OPAQUE-LABEL: @test( +// OPAQUE-NEXT: entry: +// OPAQUE-NEXT: [[P_ADDR:%.*]] = alloca ptr, align 8 +// OPAQUE-NEXT: store ptr [[P:%.*]], ptr [[P_ADDR]], align 8 +// OPAQUE-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8 +// OPAQUE-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 1 +// OPAQUE-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 +// OPAQUE-NEXT: ret i32 [[TMP1]] +// +int test(int *p) { + return p[1]; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits