[llvm] c7dce02 - [Driver] Adjust -fsanitize=function & -mexecute-only interop after D158614

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 30 20:30:17 PDT 2023


Author: Fangrui Song
Date: 2023-08-30T20:30:13-07:00
New Revision: c7dce0283b5b502dacd47eb1488342a31f4ed35a

URL: https://github.com/llvm/llvm-project/commit/c7dce0283b5b502dacd47eb1488342a31f4ed35a
DIFF: https://github.com/llvm/llvm-project/commit/c7dce0283b5b502dacd47eb1488342a31f4ed35a.diff

LOG: [Driver] Adjust -fsanitize=function & -mexecute-only interop after D158614

clangDriver depends on clangBasic, so clangBasic should not depend on
clangDriver, even just its header. Also remove clangBasic's dependency
on LLVMOption.

The issue can be seen through the bazel commit
d26dd681f9726ed7d43d7c0bdd8ee3cb2db69a2b which is reverted now.

Add hasFlagNoClaim and use it as we don't want to suppress
-Wunused-command-line-argument for -mexecute-only just because
-fsanitize= is specified.

Added: 
    

Modified: 
    clang/include/clang/Basic/Sanitizers.h
    clang/lib/Basic/CMakeLists.txt
    clang/lib/Basic/Sanitizers.cpp
    clang/lib/Driver/SanitizerArgs.cpp
    llvm/include/llvm/Option/ArgList.h
    llvm/lib/Option/ArgList.cpp
    utils/bazel/llvm-project-overlay/clang/BUILD.bazel

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/Sanitizers.h b/clang/include/clang/Basic/Sanitizers.h
index c212f80fe03adc..4659e45c788341 100644
--- a/clang/include/clang/Basic/Sanitizers.h
+++ b/clang/include/clang/Basic/Sanitizers.h
@@ -209,11 +209,6 @@ StringRef AsanDetectStackUseAfterReturnModeToString(
 llvm::AsanDetectStackUseAfterReturnMode
 AsanDetectStackUseAfterReturnModeFromString(StringRef modeStr);
 
-/// Return true if an execute-only target disallows data access to code
-/// sections.
-bool isExecuteOnlyTarget(const llvm::Triple &Triple,
-                         const llvm::opt::ArgList &Args);
-
 } // namespace clang
 
 #endif // LLVM_CLANG_BASIC_SANITIZERS_H

diff  --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt
index f93ee707dab470..db59d7dd96da0a 100644
--- a/clang/lib/Basic/CMakeLists.txt
+++ b/clang/lib/Basic/CMakeLists.txt
@@ -1,5 +1,4 @@
 set(LLVM_LINK_COMPONENTS
-  Option
   Support
   TargetParser
   )

diff  --git a/clang/lib/Basic/Sanitizers.cpp b/clang/lib/Basic/Sanitizers.cpp
index 6fbc32df314896..62ccdf8e9bbf28 100644
--- a/clang/lib/Basic/Sanitizers.cpp
+++ b/clang/lib/Basic/Sanitizers.cpp
@@ -11,13 +11,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Basic/Sanitizers.h"
-#include "clang/Driver/Options.h"
 #include "llvm/ADT/Hashing.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringSwitch.h"
-#include "llvm/Option/ArgList.h"
 #include "llvm/Support/MathExtras.h"
-#include "llvm/TargetParser/Triple.h"
 
 using namespace clang;
 
@@ -115,14 +112,4 @@ AsanDetectStackUseAfterReturnModeFromString(StringRef modeStr) {
       .Default(llvm::AsanDetectStackUseAfterReturnMode::Invalid);
 }
 
-bool isExecuteOnlyTarget(const llvm::Triple &Triple,
-                         const llvm::opt::ArgList &Args) {
-  if (Triple.isPS5())
-    return true;
-
-  // On Arm, the clang `-mexecute-only` option is used to generate the
-  // execute-only output (no data access to code sections).
-  return Args.hasFlag(clang::driver::options::OPT_mexecute_only,
-                      clang::driver::options::OPT_mno_execute_only, false);
-}
 } // namespace clang

diff  --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 71968a47fbf4fc..ad68c086b71790 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -143,6 +143,16 @@ static std::string describeSanitizeArg(const llvm::opt::Arg *A,
 /// Sanitizers set.
 static std::string toString(const clang::SanitizerSet &Sanitizers);
 
+/// Return true if an execute-only target disallows data access to code
+/// sections.
+static bool isExecuteOnlyTarget(const llvm::Triple &Triple,
+                                const llvm::opt::ArgList &Args) {
+  if (Triple.isPS5())
+    return true;
+  return Args.hasFlagNoClaim(options::OPT_mexecute_only,
+                             options::OPT_mno_execute_only, false);
+}
+
 static void validateSpecialCaseListFormat(const Driver &D,
                                           std::vector<std::string> &SCLFiles,
                                           unsigned MalformedSCLErrorDiagID,

diff  --git a/llvm/include/llvm/Option/ArgList.h b/llvm/include/llvm/Option/ArgList.h
index c3e0147f8b8930..f18585ea49fde8 100644
--- a/llvm/include/llvm/Option/ArgList.h
+++ b/llvm/include/llvm/Option/ArgList.h
@@ -299,6 +299,7 @@ class ArgList {
   /// \p Default if neither option is given. If both the option and its
   /// negation are present, the last one wins.
   bool hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const;
+  bool hasFlagNoClaim(OptSpecifier Pos, OptSpecifier Neg, bool Default) const;
 
   /// hasFlag - Given an option \p Pos, an alias \p PosAlias and its negative
   /// form \p Neg, return true if the option or its alias is present, false if

diff  --git a/llvm/lib/Option/ArgList.cpp b/llvm/lib/Option/ArgList.cpp
index 400bedabc0037d..86f28e578e5d93 100644
--- a/llvm/lib/Option/ArgList.cpp
+++ b/llvm/lib/Option/ArgList.cpp
@@ -75,6 +75,13 @@ bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
   return Default;
 }
 
+bool ArgList::hasFlagNoClaim(OptSpecifier Pos, OptSpecifier Neg,
+                             bool Default) const {
+  if (Arg *A = getLastArgNoClaim(Pos, Neg))
+    return A->getOption().matches(Pos);
+  return Default;
+}
+
 bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier PosAlias, OptSpecifier Neg,
                       bool Default) const {
   if (Arg *A = getLastArg(Pos, PosAlias, Neg))

diff  --git a/utils/bazel/llvm-project-overlay/clang/BUILD.bazel b/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
index cd47ca970315d2..037719a51dd1e8 100644
--- a/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
@@ -536,9 +536,7 @@ cc_library(
     ]),
     hdrs = glob([
         "include/clang/Basic/*.h",
-    ]) + [
-        "include/clang/Driver/Options.h"
-    ],
+    ]),
     copts = [
         "-DHAVE_VCS_VERSION_INC",
         "$(STACK_FRAME_UNLIMITED)",
@@ -592,14 +590,12 @@ cc_library(
         ":basic_riscv_vector_builtins_gen",
         ":config",
         ":diagnostic_defs_gen",
-        ":driver_options_inc_gen",
         ":sema_attr_gen",
         "//llvm:Core",
         "//llvm:FrontendDebug",
         "//llvm:FrontendOpenMP",
         "//llvm:Instrumentation",
         "//llvm:MC",
-        "//llvm:Option",
         "//llvm:Support",
         "//llvm:Target",
         "//llvm:TargetParser",


        


More information about the llvm-commits mailing list