This compiler switch allows the Randstruct feature to automatically
select structures to randomize even if they're not decorated with
the randomize_layout attribute. Structures can "opt out" of selection
by using the no_randomize_layout attribute while this feature is
active.

Co-authored-by: Cole Nixon <nixontc...@gmail.com>
Co-authored-by: Connor Kuehl <cipku...@gmail.com>
Co-authored-by: James Foster <jafoste...@gmail.com>
Co-authored-by: Jeff Takahashi <jeffrey.takaha...@gmail.com>
Co-authored-by: Jordan Cantrell <jordan.cantr...@mail.com>
Co-authored-by: Nikk Forbus <nicholas.for...@gmail.com>
Co-authored-by: Tim Pugh <nwtp...@gmail.com>
---
 clang/include/clang/Driver/Options.td     | 3 +++
 clang/lib/Driver/ToolChains/Clang.cpp     | 4 ++++
 clang/lib/Frontend/CompilerInvocation.cpp | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 735ec11e221..33bc2e1bb58 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1760,6 +1760,9 @@ def freroll_loops : Flag<["-"], "freroll-loops">, 
Group<f_Group>,
   HelpText<"Turn on loop reroller">, Flags<[CC1Option]>;
 def fno_reroll_loops : Flag<["-"], "fno-reroll-loops">, Group<f_Group>,
   HelpText<"Turn off loop reroller">;
+def randstruct_auto : Flag<["-"], "randstruct-auto">,
+  HelpText<"Enable automatic structure selection for field randomization; "
+           "Disable for specific structures with attribute 
no_randomize_layout">, Flags<[CC1Option]>;
 def ftrigraphs : Flag<["-"], "ftrigraphs">, Group<f_Group>,
   HelpText<"Process trigraph sequences">, Flags<[CC1Option]>;
 def fno_trigraphs : Flag<["-"], "fno-trigraphs">, Group<f_Group>,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 52daed9fe36..bfc383b8d78 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4433,6 +4433,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
     CmdArgs.push_back(A->getValue(0));
   }
 
+  if (Arg *A = Args.getLastArg(options::OPT_randstruct_auto)) {
+    CmdArgs.push_back( "-randstruct-auto" );
+  }
+
   // -fvisibility= and -fvisibility-ms-compat are of a piece.
   if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
                                      options::OPT_fvisibility_ms_compat)) {
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index b4423dabbe7..c3f4ea83d6c 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1678,6 +1678,9 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, 
ArgList &Args,
   if (const Arg* A = Args.getLastArg(OPT_randstruct_seed)) {
     RandstructSeed = A->getValue(0);
   }
+  if (const Arg* A = Args.getLastArg(OPT_randstruct_auto)) {
+    RandstructAutoSelect = true;
+  }
   Opts.AddPluginActions = Args.getAllArgValues(OPT_add_plugin);
   for (const auto *AA : Args.filtered(OPT_plugin_arg))
     Opts.PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
-- 
2.17.1

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to