aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLai Wei-Chih <Robert.Lai@mediatek.com>2013-08-01 15:09:46 +0800
committerAndrew Hsieh <andrewhsieh@google.com>2013-08-02 09:16:10 +0800
commita3529b2d6b2bcc7136fd67e00e539301942e74d1 (patch)
tree3a65fd83e08762984d1721884e17215244460b14
parent15ba1ff9c0885836175afdcd03701e5a3e514ae1 (diff)
downloadtoolchain_gcc-a3529b2d6b2bcc7136fd67e00e539301942e74d1.tar.gz
toolchain_gcc-a3529b2d6b2bcc7136fd67e00e539301942e74d1.tar.bz2
toolchain_gcc-a3529b2d6b2bcc7136fd67e00e539301942e74d1.zip
Add an internal switch -minline-thumb1-jumptable to ARM gcc4.6/4.7/4.8
Default is off (ie. no changes of behavior), meaning that gcc may generate thumb1 jumptable helper calls (eg. __gnu_thumb1_case_sqi) for switch/case. Use -minline-thumb1-jumptable to compile code which can be linked with compiler-rt where helper __gnu_thumb1_case_* doesn't exist. This is mainly for use to compile NDK gabi++/stlport/libc++ to be independent of libgcc.a. The only affected binaries are all in armeabi. ABIs armeabi-v7a and x86/mips aren't affected. Size differences are libgabi++_static.a 176286 -> 176538 +0.1% libstlport_static.a 1406346 -> 1413318 +0.5% libc++_static.a 2426814 -> 2439074 +0.5% Change-Id: I582898955b28e53e988a91bc1a64b76fba677e58
-rw-r--r--gcc-4.6/gcc/config/arm/arm.h3
-rw-r--r--gcc-4.6/gcc/config/arm/arm.md2
-rw-r--r--gcc-4.6/gcc/config/arm/arm.opt4
-rw-r--r--gcc-4.6/gcc/config/arm/elf.h3
-rw-r--r--gcc-4.7/gcc/config/arm/arm.h3
-rw-r--r--gcc-4.7/gcc/config/arm/arm.md2
-rw-r--r--gcc-4.7/gcc/config/arm/arm.opt4
-rw-r--r--gcc-4.7/gcc/config/arm/elf.h3
-rw-r--r--gcc-4.8/gcc/config/arm/arm.h3
-rw-r--r--gcc-4.8/gcc/config/arm/arm.md2
-rw-r--r--gcc-4.8/gcc/config/arm/arm.opt4
-rw-r--r--gcc-4.8/gcc/config/arm/elf.h3
12 files changed, 27 insertions, 9 deletions
diff --git a/gcc-4.6/gcc/config/arm/arm.h b/gcc-4.6/gcc/config/arm/arm.h
index 9b0a83475..b41f3a73d 100644
--- a/gcc-4.6/gcc/config/arm/arm.h
+++ b/gcc-4.6/gcc/config/arm/arm.h
@@ -1965,10 +1965,11 @@ typedef struct
#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 \
|| (TARGET_THUMB1 \
+ && !inline_thumb1_jump_table \
&& (optimize_size || flag_pic)))
#define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
- (TARGET_THUMB1 \
+ (TARGET_THUMB1 && !inline_thumb1_jump_table \
? (min >= 0 && max < 512 \
? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode) \
: min >= -256 && max < 256 \
diff --git a/gcc-4.6/gcc/config/arm/arm.md b/gcc-4.6/gcc/config/arm/arm.md
index cc73aa2f3..5a50f8754 100644
--- a/gcc-4.6/gcc/config/arm/arm.md
+++ b/gcc-4.6/gcc/config/arm/arm.md
@@ -8343,7 +8343,7 @@
(match_operand:SI 2 "const_int_operand" "") ; total range
(match_operand:SI 3 "" "") ; table label
(match_operand:SI 4 "" "")] ; Out of range label
- "TARGET_32BIT || optimize_size || flag_pic"
+ "TARGET_32BIT || ((optimize_size || flag_pic) && !inline_thumb1_jump_table)"
"
{
enum insn_code code;
diff --git a/gcc-4.6/gcc/config/arm/arm.opt b/gcc-4.6/gcc/config/arm/arm.opt
index a39bb3a8d..a7ab693b3 100644
--- a/gcc-4.6/gcc/config/arm/arm.opt
+++ b/gcc-4.6/gcc/config/arm/arm.opt
@@ -137,6 +137,10 @@ mthumb-interwork
Target Report Mask(INTERWORK)
Support calls between Thumb and ARM instruction sets
+minline-thumb1-jumptable
+Target Report Var(inline_thumb1_jump_table)
+Inline Thumb1 Jump table code
+
mtp=
Target RejectNegative Joined Var(target_thread_switch)
Specify how to access the thread pointer
diff --git a/gcc-4.6/gcc/config/arm/elf.h b/gcc-4.6/gcc/config/arm/elf.h
index 44d840b39..cb84a594f 100644
--- a/gcc-4.6/gcc/config/arm/elf.h
+++ b/gcc-4.6/gcc/config/arm/elf.h
@@ -104,7 +104,8 @@
the code more efficient, but for Thumb-1 it's better to put them out of
band unless we are generating compressed tables. */
#define JUMP_TABLES_IN_TEXT_SECTION \
- (TARGET_32BIT || (TARGET_THUMB && (optimize_size || flag_pic)))
+ (TARGET_32BIT || (TARGET_THUMB && !inline_thumb1_jump_table \
+ && (optimize_size || flag_pic)))
#ifndef LINK_SPEC
#define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X"
diff --git a/gcc-4.7/gcc/config/arm/arm.h b/gcc-4.7/gcc/config/arm/arm.h
index 7ce48d13a..c82847fe2 100644
--- a/gcc-4.7/gcc/config/arm/arm.h
+++ b/gcc-4.7/gcc/config/arm/arm.h
@@ -1843,10 +1843,11 @@ typedef struct
#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 \
|| (TARGET_THUMB1 \
+ && !inline_thumb1_jump_table \
&& (optimize_size || flag_pic)))
#define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
- (TARGET_THUMB1 \
+ (TARGET_THUMB1 && !inline_thumb1_jump_table \
? (min >= 0 && max < 512 \
? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode) \
: min >= -256 && max < 256 \
diff --git a/gcc-4.7/gcc/config/arm/arm.md b/gcc-4.7/gcc/config/arm/arm.md
index fee20175f..d9a07ae8f 100644
--- a/gcc-4.7/gcc/config/arm/arm.md
+++ b/gcc-4.7/gcc/config/arm/arm.md
@@ -8755,7 +8755,7 @@
(match_operand:SI 2 "const_int_operand" "") ; total range
(match_operand:SI 3 "" "") ; table label
(match_operand:SI 4 "" "")] ; Out of range label
- "TARGET_32BIT || optimize_size || flag_pic"
+ "TARGET_32BIT || ((optimize_size || flag_pic) && !inline_thumb1_jump_table)"
"
{
enum insn_code code;
diff --git a/gcc-4.7/gcc/config/arm/arm.opt b/gcc-4.7/gcc/config/arm/arm.opt
index e03a16337..de60108bc 100644
--- a/gcc-4.7/gcc/config/arm/arm.opt
+++ b/gcc-4.7/gcc/config/arm/arm.opt
@@ -205,6 +205,10 @@ mthumb-interwork
Target Report Mask(INTERWORK)
Support calls between Thumb and ARM instruction sets
+minline-thumb1-jumptable
+Target Report Var(inline_thumb1_jump_table)
+Inline Thumb1 Jump table code
+
mtls-dialect=
Target RejectNegative Joined Enum(tls_type) Var(target_tls_dialect) Init(TLS_GNU)
Specify thread local storage scheme
diff --git a/gcc-4.7/gcc/config/arm/elf.h b/gcc-4.7/gcc/config/arm/elf.h
index 417adf8a2..f8bf4cf40 100644
--- a/gcc-4.7/gcc/config/arm/elf.h
+++ b/gcc-4.7/gcc/config/arm/elf.h
@@ -102,7 +102,8 @@
the code more efficient, but for Thumb-1 it's better to put them out of
band unless we are generating compressed tables. */
#define JUMP_TABLES_IN_TEXT_SECTION \
- (TARGET_32BIT || (TARGET_THUMB && (optimize_size || flag_pic)))
+ (TARGET_32BIT || (TARGET_THUMB && !inline_thumb1_jump_table \
+ && (optimize_size || flag_pic)))
#ifndef LINK_SPEC
#define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X"
diff --git a/gcc-4.8/gcc/config/arm/arm.h b/gcc-4.8/gcc/config/arm/arm.h
index 05aea3577..478a3d7c8 100644
--- a/gcc-4.8/gcc/config/arm/arm.h
+++ b/gcc-4.8/gcc/config/arm/arm.h
@@ -1944,10 +1944,11 @@ enum arm_auto_incmodes
#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 \
|| (TARGET_THUMB1 \
+ && !inline_thumb1_jump_table \
&& (optimize_size || flag_pic)))
#define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
- (TARGET_THUMB1 \
+ (TARGET_THUMB1 && !inline_thumb1_jump_table \
? (min >= 0 && max < 512 \
? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode) \
: min >= -256 && max < 256 \
diff --git a/gcc-4.8/gcc/config/arm/arm.md b/gcc-4.8/gcc/config/arm/arm.md
index a532e56ce..aea02fbf4 100644
--- a/gcc-4.8/gcc/config/arm/arm.md
+++ b/gcc-4.8/gcc/config/arm/arm.md
@@ -8807,7 +8807,7 @@
(match_operand:SI 2 "const_int_operand" "") ; total range
(match_operand:SI 3 "" "") ; table label
(match_operand:SI 4 "" "")] ; Out of range label
- "TARGET_32BIT || optimize_size || flag_pic"
+ "TARGET_32BIT || ((optimize_size || flag_pic) && !inline_thumb1_jump_table)"
"
{
enum insn_code code;
diff --git a/gcc-4.8/gcc/config/arm/arm.opt b/gcc-4.8/gcc/config/arm/arm.opt
index e778407ab..85826c1e4 100644
--- a/gcc-4.8/gcc/config/arm/arm.opt
+++ b/gcc-4.8/gcc/config/arm/arm.opt
@@ -185,6 +185,10 @@ mthumb-interwork
Target Report Mask(INTERWORK)
Support calls between Thumb and ARM instruction sets
+minline-thumb1-jumptable
+Target Report Var(inline_thumb1_jump_table)
+Inline Thumb1 Jump table code
+
mtls-dialect=
Target RejectNegative Joined Enum(tls_type) Var(target_tls_dialect) Init(TLS_GNU)
Specify thread local storage scheme
diff --git a/gcc-4.8/gcc/config/arm/elf.h b/gcc-4.8/gcc/config/arm/elf.h
index 96fadebc3..d1a112d5c 100644
--- a/gcc-4.8/gcc/config/arm/elf.h
+++ b/gcc-4.8/gcc/config/arm/elf.h
@@ -101,7 +101,8 @@
the code more efficient, but for Thumb-1 it's better to put them out of
band unless we are generating compressed tables. */
#define JUMP_TABLES_IN_TEXT_SECTION \
- (TARGET_32BIT || (TARGET_THUMB && (optimize_size || flag_pic)))
+ (TARGET_32BIT || (TARGET_THUMB && !inline_thumb1_jump_table \
+ && (optimize_size || flag_pic)))
#ifndef LINK_SPEC
#define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X"