[PATCH] D35578: Add -fswitch-tables and -fno-switch-tables flags

Sumanth Gundapaneni via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 18 13:15:20 PDT 2017


sgundapa created this revision.

These flags control the lowering of switch statements to either lookup tables
 or jump tables.


https://reviews.llvm.org/D35578

Files:
  include/clang/Driver/Options.td
  lib/Driver/ToolChains/Clang.cpp
  lib/Frontend/CompilerInvocation.cpp
  test/CodeGen/nouseswitchtable.c


Index: test/CodeGen/nouseswitchtable.c
===================================================================
--- /dev/null
+++ test/CodeGen/nouseswitchtable.c
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -S -fno-switch-tables %s -emit-llvm -o - | FileCheck %s
+
+// CHECK-LABEL: main
+// CHECK: attributes #0 = {{.*}}"no-jump-tables"="true"{{.*}}"no-lookup-tables"="true"
+
+int main() {
+  return 0;
+}
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -650,9 +650,11 @@
 
   Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);
 
-  Opts.NoUseJumpTables = Args.hasArg(OPT_fno_jump_tables);
+  Opts.NoUseJumpTables =
+      (Args.hasArg(OPT_fno_jump_tables) || Args.hasArg(OPT_fno_switch_tables));
 
-  Opts.NoUseLookupTables = Args.hasArg(OPT_fno_lookup_tables);
+  Opts.NoUseLookupTables = (Args.hasArg(OPT_fno_lookup_tables) ||
+                            Args.hasArg(OPT_fno_switch_tables));
 
   Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ);
   Opts.EmitSummaryIndex = false;
Index: lib/Driver/ToolChains/Clang.cpp
===================================================================
--- lib/Driver/ToolChains/Clang.cpp
+++ lib/Driver/ToolChains/Clang.cpp
@@ -2262,13 +2262,22 @@
     A->claim();
   }
 
-  if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
-                    true))
-    CmdArgs.push_back("-fno-jump-tables");
+  // fno-switch-tables disables the generation of both lookup and jump tables.
+  if (Arg *A = Args.getLastArg(
+          options::OPT_fjump_tables, options::OPT_fno_jump_tables,
+          options::OPT_fswitch_tables, options::OPT_fno_switch_tables)) {
+    if (A->getOption().matches(options::OPT_fno_jump_tables) ||
+        A->getOption().matches(options::OPT_fno_switch_tables))
+      CmdArgs.push_back("-fno-jump-tables");
+  }
 
-  if (!Args.hasFlag(options::OPT_flookup_tables, options::OPT_fno_lookup_tables,
-                    true))
-    CmdArgs.push_back("-fno-lookup-tables");
+  if (Arg *A = Args.getLastArg(
+          options::OPT_flookup_tables, options::OPT_fno_lookup_tables,
+          options::OPT_fswitch_tables, options::OPT_fno_switch_tables)) {
+    if (A->getOption().matches(options::OPT_fno_lookup_tables) ||
+        A->getOption().matches(options::OPT_fno_switch_tables))
+      CmdArgs.push_back("-fno-lookup-tables");
+  }
 
   if (!Args.hasFlag(options::OPT_fpreserve_as_comments,
                     options::OPT_fno_preserve_as_comments, true))
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -795,6 +795,9 @@
 def flookup_tables : Flag<["-"], "flookup-tables">, Group<f_Group>;
 def fno_lookup_tables : Flag<["-"], "fno-lookup-tables">, Group<f_Group>, Flags<[CC1Option]>,
   HelpText<"Do not use lookup tables for lowering switches">;
+def fswitch_tables : Flag<["-"], "fswitch-tables">, Group<f_Group>;
+def fno_switch_tables : Flag<["-"], "fno-switch-tables">, Group<f_Group>, Flags<[CC1Option]>,
+  HelpText<"Do not use jump tables and lookup tables for lowering switches">;
 
 // Begin sanitizer flags. These should all be core options exposed in all driver
 // modes.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35578.107164.patch
Type: text/x-patch
Size: 3358 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170718/4a8bc4c2/attachment.bin>


More information about the llvm-commits mailing list