aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2020-02-02 19:30:39 -0800
committerFangrui Song <maskray@google.com>2020-02-02 20:45:29 -0800
commitaed488e3a4dfdf15696521e13ac5e6ac2f9e7af7 (patch)
treece8b12a4f8d769ab268842b1b2a89e1c6511bb50
parentdb7d2ab03d9a7372e86abeec6b99e83c763dfa42 (diff)
downloadllvm-aed488e3a4dfdf15696521e13ac5e6ac2f9e7af7.zip
llvm-aed488e3a4dfdf15696521e13ac5e6ac2f9e7af7.tar.gz
llvm-aed488e3a4dfdf15696521e13ac5e6ac2f9e7af7.tar.bz2
[Driver] Move -fsemantic-interposition decision from cc1 to driver
And add test/Driver/fsemantic-interposition.c
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp9
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp4
-rw-r--r--clang/test/CodeGen/semantic-interposition.c17
-rw-r--r--clang/test/Driver/clang_f_opts.c2
-rw-r--r--clang/test/Driver/fsemantic-interposition.c9
5 files changed, 19 insertions, 22 deletions
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index c8195f0..433fdde 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4384,6 +4384,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(A->getValue());
}
+ if (Args.hasFlag(options::OPT_fsemantic_interposition,
+ options::OPT_fno_semantic_interposition, false) &&
+ RelocationModel != llvm::Reloc::Static && !IsPIE)
+ CmdArgs.push_back("-fsemantic-interposition");
+
CmdArgs.push_back("-mthread-model");
if (Arg *A = Args.getLastArg(options::OPT_mthread_model)) {
if (!TC.isThreadModelSupported(A->getValue()))
@@ -5036,10 +5041,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
options::OPT_fno_emulated_tls);
Args.AddLastArg(CmdArgs, options::OPT_fkeep_static_consts);
- if (Args.hasFlag(options::OPT_fsemantic_interposition,
- options::OPT_fno_semantic_interposition, false))
- CmdArgs.push_back("-fsemantic-interposition");
-
// AltiVec-like language extensions aren't relevant for assembling.
if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm)
Args.AddLastArg(CmdArgs, options::OPT_fzvector);
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index f3015d0..a711452 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3031,9 +3031,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
Opts.setDefaultCallingConv(DefaultCC);
}
- // -fsemantic-interposition
- Opts.SemanticInterposition =
- Args.hasArg(OPT_fsemantic_interposition) && Opts.PICLevel && !Opts.PIE;
+ Opts.SemanticInterposition = Args.hasArg(OPT_fsemantic_interposition);
// -mrtd option
if (Arg *A = Args.getLastArg(OPT_mrtd)) {
diff --git a/clang/test/CodeGen/semantic-interposition.c b/clang/test/CodeGen/semantic-interposition.c
index 77df615..43656e3 100644
--- a/clang/test/CodeGen/semantic-interposition.c
+++ b/clang/test/CodeGen/semantic-interposition.c
@@ -1,14 +1,5 @@
-// Semantic Interposition is active if
-// -fsemantic-interposition is set,
-// - pic-level > 0
-// - pic-is-pie is not set
+// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition %s -o - | FileCheck --check-prefix=INTERPOSITION %s
+// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck --check-prefix=NO %s
-// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition -pic-level 0 %s -o - | FileCheck %s -check-prefix=CHECK-NO-INTERPOSITION
-// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition -pic-level 1 %s -o - | FileCheck %s -check-prefix=CHECK-INTERPOSITION
-// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition -pic-level 2 %s -o - | FileCheck %s -check-prefix=CHECK-INTERPOSITION
-// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition -pic-level 0 %s -o - | FileCheck %s -check-prefix=CHECK-NO-INTERPOSITION
-// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition -pic-level 1 -pic-is-pie %s -o - | FileCheck %s -check-prefix=CHECK-NO-INTERPOSITION
-// RUN: %clang_cc1 -emit-llvm -fsemantic-interposition -pic-level 2 -pic-is-pie %s -o - | FileCheck %s -check-prefix=CHECK-NO-INTERPOSITION
-
-// CHECK-NO-INTERPOSITION-NOT: "SemanticInterposition"
-// CHECK-INTERPOSITION: !{{[0-9]+}} = !{i32 1, !"SemanticInterposition", i32 1}
+// INTERPOSITION: !{{[0-9]+}} = !{i32 1, !"SemanticInterposition", i32 1}
+// NO-NOT: "SemanticInterposition"
diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c
index e3fe373..970b4e9 100644
--- a/clang/test/Driver/clang_f_opts.c
+++ b/clang/test/Driver/clang_f_opts.c
@@ -251,8 +251,6 @@
// RUN: -fexec-charset=UTF-8 \
// RUN: -fivopts -fno-ivopts \
// RUN: -fnon-call-exceptions -fno-non-call-exceptions \
-// RUN: -fno-semantic-interposition \
-// RUN: -fsemantic-interposition \
// RUN: -fpermissive -fno-permissive \
// RUN: -fdefer-pop -fno-defer-pop \
// RUN: -fprefetch-loop-arrays -fno-prefetch-loop-arrays \
diff --git a/clang/test/Driver/fsemantic-interposition.c b/clang/test/Driver/fsemantic-interposition.c
new file mode 100644
index 0000000..484be67
--- /dev/null
+++ b/clang/test/Driver/fsemantic-interposition.c
@@ -0,0 +1,9 @@
+// RUN: %clang -target %itanium_abi_triple %s -Werror -fpic -fsemantic-interposition -c -### 2>&1 | FileCheck %s
+// RUN: %clang -target %itanium_abi_triple %s -Werror -fPIC -fsemantic-interposition -c -### 2>&1 | FileCheck %s
+// CHECK: "-fsemantic-interposition"
+
+// RUN: %clang -target %itanium_abi_triple %s -Werror -fPIC -fsemantic-interposition -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang -target %itanium_abi_triple %s -Werror -fsemantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang -target %itanium_abi_triple %s -Werror -fPIC -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang -target %itanium_abi_triple %s -Werror -fPIE -fsemantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// NO-NOT: "-fsemantic-interposition"