[clang] d69e9f9 - [OpaquePtrs][Clang] Add -opaque-pointers/-no-opaque-pointers cc1 options

Nikita Popov via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 5 01:15:49 PDT 2022


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];
+}


        


More information about the cfe-commits mailing list