[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