[clang] d3b75c4 - [clang] Make `-fvisibility={}` and `-ftype-visibility={}` benign options. (#71985)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 16 08:41:24 PST 2023
Author: Juergen Ributzka
Date: 2023-11-16T08:41:20-08:00
New Revision: d3b75c4750673b6d0d8a224f02b2c0885209a49a
URL: https://github.com/llvm/llvm-project/commit/d3b75c4750673b6d0d8a224f02b2c0885209a49a
DIFF: https://github.com/llvm/llvm-project/commit/d3b75c4750673b6d0d8a224f02b2c0885209a49a.diff
LOG: [clang] Make `-fvisibility={}` and `-ftype-visibility={}` benign options. (#71985)
Both options do not affect the AST content that is serialized into the PCM. This
commit includes the following changes:
1.) Mark `-fvisibility={}` and `-ftype-visibility={}` as benign options.That
means they are no longer considered part of the module hash, which can
reduce the number of module variants.
2.) Add a test to verify the generated LLVM IR is not affected by the default
visibiliy mode in the module.
3.) Add a test to clang-scan-deps to ensure only one module is build, even if
the above mentioned options are used.
This fixes rdar://118246054.
Added:
clang/test/ClangScanDeps/strip-visibility.c
clang/test/Modules/codegen-visibility.cpp
clang/test/Modules/visibility.cpp
Modified:
clang/include/clang/Basic/LangOptions.def
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def
index c541ccefdd5fbe1..6ad6ccbe4a78c5f 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -349,9 +349,9 @@ LANGOPT(
"type's inheritance model would be determined under the Microsoft ABI")
ENUM_LANGOPT(GC, GCMode, 2, NonGC, "Objective-C Garbage Collection mode")
-ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility,
+BENIGN_ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility,
"default visibility for functions and variables [-fvisibility]")
-ENUM_LANGOPT(TypeVisibilityMode, Visibility, 3, DefaultVisibility,
+BENIGN_ENUM_LANGOPT(TypeVisibilityMode, Visibility, 3, DefaultVisibility,
"default visibility for types [-ftype-visibility]")
LANGOPT(SetVisibilityForExternDecls, 1, 0,
"apply global symbol visibility to external declarations without an explicit visibility")
diff --git a/clang/test/ClangScanDeps/strip-visibility.c b/clang/test/ClangScanDeps/strip-visibility.c
new file mode 100644
index 000000000000000..3c8de700b12bab1
--- /dev/null
+++ b/clang/test/ClangScanDeps/strip-visibility.c
@@ -0,0 +1,59 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json
+
+// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -mode preprocess-dependency-directives > %t/result.txt
+
+// RUN: FileCheck %s -input-file %t/result.txt
+
+// Verify that there's a single version of module A.
+
+// CHECK: "modules": [
+// CHECK-NEXT: {
+// CHECK: "command-line": [
+// CHECK-NOT: "-fvisibility="
+// CHECK-NOT: "-ftype-visibility="
+// CHECK: ]
+// CHECK: "name": "A"
+// CHECK: }
+// CHECK-NOT: "name": "A"
+// CHECK: "translation-units"
+
+//--- cdb.json.template
+[
+ {
+ "directory": "DIR",
+ "command": "clang -Imodules/A -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -fsyntax-only DIR/t1.c",
+ "file": "DIR/t1.c"
+ },
+ {
+ "directory": "DIR",
+ "command": "clang -Imodules/A -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -fvisibility=hidden -fsyntax-only DIR/t2.c",
+ "file": "DIR/t2.c"
+ },
+ {
+ "directory": "DIR",
+ "command": "clang -Imodules/A -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -fvisibility=hidden -fvisibility-ms-compat -fsyntax-only DIR/t3.c",
+ "file": "DIR/t3.c"
+ }
+]
+
+//--- modules/A/module.modulemap
+
+module A {
+ umbrella header "A.h"
+}
+
+//--- modules/A/A.h
+
+typedef int A_t;
+extern int a(void);
+
+//--- t1.c
+#include "A.h"
+
+//--- t2.c
+#include "A.h"
+
+//--- t3.c
+#include "A.h"
diff --git a/clang/test/Modules/codegen-visibility.cpp b/clang/test/Modules/codegen-visibility.cpp
new file mode 100644
index 000000000000000..bb87557d6f71a14
--- /dev/null
+++ b/clang/test/Modules/codegen-visibility.cpp
@@ -0,0 +1,40 @@
+// Test that modules with
diff erent visibility mode can be shared.
+// REQUIRES: aarch64-registered-target
+
+// RUN: rm -rf %t && mkdir %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=default -fmodules-codegen -fmodules -emit-module -fmodule-name=foo %t/foo.modulemap -o %t/foo.pcm
+
+// RUN: %clang_cc1 -emit-llvm %t/foo.pcm -o - | FileCheck %s --check-prefix=DEF
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=hidden -fmodules -fmodule-file=%t/foo.pcm -I%t -emit-llvm %t/test.cpp -o - | FileCheck %s --check-prefixes=USE
+
+// DEF: define void @_Z2f4v()
+// DEF: define weak_odr void @_Z2f3v()
+
+// USE: define hidden void @_Z4testv()
+// USE: declare void @_Z2f1v()
+// USE: define internal void @_ZL2f2v()
+// USE: declare void @_Z2f3v()
+// USE: declare void @_Z2f4v()
+
+
+//--- foo.h
+void f1();
+static void f2() {}
+inline void f3() {}
+void f4() {}
+
+//--- test.cpp
+#include "foo.h"
+
+void test() {
+ f1();
+ f2();
+ f3();
+ f4();
+}
+
+//--- foo.modulemap
+module foo { header "foo.h" }
+
diff --git a/clang/test/Modules/visibility.cpp b/clang/test/Modules/visibility.cpp
new file mode 100644
index 000000000000000..c912a4195deb9d4
--- /dev/null
+++ b/clang/test/Modules/visibility.cpp
@@ -0,0 +1,44 @@
+// Test that modules with
diff erent visibility mode can be shared.
+// REQUIRES: aarch64-registered-target
+
+// RUN: rm -rf %t && mkdir %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=default -fmodules -emit-module -fmodule-name=foo %t/foo.modulemap -o %t/foo.default.pcm
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=hidden -fmodules -emit-module -fmodule-name=foo %t/foo.modulemap -o %t/foo.hidden.pcm
+
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=default -fmodules -fmodule-file=%t/foo.default.pcm -I%t -emit-llvm %t/test.cpp -o - | FileCheck %s --check-prefixes=DEFAULT,BOTH
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=default -fmodules -fmodule-file=%t/foo.hidden.pcm -I%t -emit-llvm %t/test.cpp -o - | FileCheck %s --check-prefixes=DEFAULT,BOTH
+
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=hidden -fmodules -fmodule-file=%t/foo.default.pcm -I%t -emit-llvm %t/test.cpp -o - | FileCheck %s --check-prefixes=HIDDEN,BOTH
+// RUN: %clang_cc1 -triple arm64e-apple-macos -x c++ -fvisibility=hidden -fmodules -fmodule-file=%t/foo.hidden.pcm -I%t -emit-llvm %t/test.cpp -o - | FileCheck %s --check-prefixes=HIDDEN,BOTH
+
+// DEFAULT: define void @_Z2f4v()
+// HIDDEN: define hidden void @_Z2f4v()
+// DEFAULT: define void @_Z4testv()
+// HIDDEN: define hidden void @_Z4testv()
+// BOTH: declare void @_Z2f1v()
+// BOTH: define internal void @_ZL2f2v()
+// DEFAULT: define linkonce_odr void @_Z2f3v()
+// HIDDEN: define linkonce_odr hidden void @_Z2f3v()
+
+
+//--- foo.h
+void f1();
+static void f2() {}
+inline void f3() {}
+void f4() {}
+
+//--- test.cpp
+#include "foo.h"
+
+void test() {
+ f1();
+ f2();
+ f3();
+ f4();
+}
+
+//--- foo.modulemap
+module foo { header "foo.h" }
+
More information about the cfe-commits
mailing list