6 files changed +69
-0
lines changed Original file line number Diff line number Diff line change @@ -137,6 +137,14 @@ fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribu
137
137
}
138
138
}
139
139
140
+ fn nojumptables_attr < ' ll > ( cx : & CodegenCx < ' ll , ' _ > ) -> Option < & ' ll Attribute > {
141
+ if !cx. sess ( ) . opts . unstable_opts . no_jump_tables {
142
+ return None ;
143
+ }
144
+
145
+ Some ( llvm:: CreateAttrStringValue ( cx. llcx , "no-jump-tables" , "true" ) )
146
+ }
147
+
140
148
fn probestack_attr < ' ll > ( cx : & CodegenCx < ' ll , ' _ > ) -> Option < & ' ll Attribute > {
141
149
// Currently stack probes seem somewhat incompatible with the address
142
150
// sanitizer and thread sanitizer. With asan we're already protected from
@@ -293,6 +301,7 @@ pub fn from_fn_attrs<'ll, 'tcx>(
293
301
// FIXME: none of these three functions interact with source level attributes.
294
302
to_add. extend ( frame_pointer_type_attr ( cx) ) ;
295
303
to_add. extend ( instrument_function_attr ( cx) ) ;
304
+ to_add. extend ( nojumptables_attr ( cx) ) ;
296
305
to_add. extend ( probestack_attr ( cx) ) ;
297
306
to_add. extend ( stackprotector_attr ( cx) ) ;
298
307
Original file line number Diff line number Diff line change @@ -754,6 +754,7 @@ fn test_unstable_options_tracking_hash() {
754
754
tracked ! ( move_size_limit, Some ( 4096 ) ) ;
755
755
tracked ! ( mutable_noalias, Some ( true ) ) ;
756
756
tracked ! ( no_generate_arange_section, true ) ;
757
+ tracked ! ( no_jump_tables, true ) ;
757
758
tracked ! ( no_link, true ) ;
758
759
tracked ! ( no_profiler_runtime, true ) ;
759
760
tracked ! ( no_unique_section_names, true ) ;
Original file line number Diff line number Diff line change @@ -1421,6 +1421,8 @@ options! {
1421
1421
"run all passes except codegen; no output" ) ,
1422
1422
no_generate_arange_section: bool = ( false , parse_no_flag, [ TRACKED ] ,
1423
1423
"omit DWARF address ranges that give faster lookups" ) ,
1424
+ no_jump_tables: bool = ( false , parse_no_flag, [ TRACKED ] ,
1425
+ "disable the jump tables and lookup tables that can be generated from a switch case lowering" ) ,
1424
1426
no_leak_check: bool = ( false , parse_no_flag, [ UNTRACKED ] ,
1425
1427
"disable the 'leak check' for subtyping; unsound, but useful for tests" ) ,
1426
1428
no_link: bool = ( false , parse_no_flag, [ TRACKED ] ,
Original file line number Diff line number Diff line change
1
+ // Test that jump tables are (not) emitted when the `-Zno-jump-tables`
2
+ // flag is (not) set.
3
+
4
+ // revisions: unset set
5
+ // assembly-output: emit-asm
6
+ // compile-flags: -O
7
+ // [set] compile-flags: -Zno-jump-tables
8
+ // only-x86_64
9
+
10
+ #![ crate_type = "lib" ]
11
+
12
+ extern "C" {
13
+ fn bar1 ( ) ;
14
+ fn bar2 ( ) ;
15
+ fn bar3 ( ) ;
16
+ fn bar4 ( ) ;
17
+ fn bar5 ( ) ;
18
+ fn bar6 ( ) ;
19
+ }
20
+
21
+ // CHECK-LABEL: foo:
22
+ #[ no_mangle]
23
+ pub unsafe fn foo ( x : i32 ) {
24
+ // unset: LJTI0_0
25
+ // set-NOT: LJTI0_0
26
+ match x {
27
+ 1 => bar1 ( ) ,
28
+ 2 => bar2 ( ) ,
29
+ 3 => bar3 ( ) ,
30
+ 4 => bar4 ( ) ,
31
+ 5 => bar5 ( ) ,
32
+ _ => bar6 ( ) ,
33
+ }
34
+ }
Original file line number Diff line number Diff line change
1
+ // Test that the `no-jump-tables` function attribute are (not) emitted when
2
+ // the `-Zno-jump-tables` flag is (not) set.
3
+
4
+ // revisions: unset set
5
+ // needs-llvm-components: x86
6
+ // compile-flags: --target x86_64-unknown-linux-gnu
7
+ // [set] compile-flags: -Zno-jump-tables
8
+
9
+ #![ crate_type = "lib" ]
10
+ #![ feature( no_core, lang_items) ]
11
+ #![ no_core]
12
+
13
+ #[ lang = "sized" ]
14
+ trait Sized { }
15
+
16
+ #[ no_mangle]
17
+ pub fn foo ( ) {
18
+ // CHECK: @foo() unnamed_addr #0
19
+
20
+ // unset-NOT: attributes #0 = { {{.*}}"no-jump-tables"="true"{{.*}} }
21
+ // set: attributes #0 = { {{.*}}"no-jump-tables"="true"{{.*}} }
22
+ }
Original file line number Diff line number Diff line change 92
92
-Z no-analysis=val -- parse and expand the source, but run no analysis
93
93
-Z no-codegen=val -- run all passes except codegen; no output
94
94
-Z no-generate-arange-section=val -- omit DWARF address ranges that give faster lookups
95
+ -Z no-jump-tables=val -- disable the jump tables and lookup tables that can be generated from a switch case lowering
95
96
-Z no-leak-check=val -- disable the 'leak check' for subtyping; unsound, but useful for tests
96
97
-Z no-link=val -- compile without linking
97
98
-Z no-parallel-llvm=val -- run LLVM in non-parallel mode (while keeping codegen-units and ThinLTO)
0 commit comments