aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Hsieh <andrewhsieh@google.com>2012-11-27 14:48:18 +0800
committerAndrew Hsieh <andrewhsieh@google.com>2012-11-27 15:02:36 +0800
commit954a4ce00a0a2a93c783c30141e9703cca2442f6 (patch)
tree471fc71a6ddfc7178655f017e6357584d517535c
parent07d0f8a9ce3cf806a3a157d86181fc343cc54bac (diff)
downloadtoolchain_gcc-954a4ce00a0a2a93c783c30141e9703cca2442f6.tar.gz
toolchain_gcc-954a4ce00a0a2a93c783c30141e9703cca2442f6.tar.bz2
toolchain_gcc-954a4ce00a0a2a93c783c30141e9703cca2442f6.zip
Add helper functions to GCC 4.4.3 for Thumb1 compressed dispatch-table call
This is partial port of r148770 to resolve GCC 4.4.3 linker error when taking library armeabi/libgabi++_static.a compiled by later GCC. ./obj/local/armeabi/libgabi++_static.a(dwarf_helper.o): In function __cxxabiv1::readEncodedPointer(unsigned char const**, unsigned char)': dwarf_helper.cc:(.text+0x74): undefined reference to __gnu_thumb1_case_sqi' This change is partial because it only provides enough helper functions in lib1funcs.asm, but doesn't enable GCC 4.4.3 to geneate Thumb1 compressed dispatch-table. ------------------------------------------------------------------------ r148770 | rearnsha | 2009-06-22 04:48:15 +0800 (Mon, 22 Jun 2009) | 27 lines * arm.c (thumb1_output_casesi): New function. * arm.h (CASE_VECTOR_PC_RELATIVE): Thumb-1 code is also relative if optimizing for size or PIC. (CASE_VECTOR_SHORTEN_MODE): Handle thumb-1. * arm.md (UNSPEC_THUMB1_CASESI): New constant. (casesi): Handle Thumb-1 when optimizing for size or PIC. (thumb1_casesi_internal_pic): New expand rule. (thumb1_casesi_dispatch): New pattern. * aout.h (ASM_OUTPUT_ADDR_DIFF_ELT): Use shortened vectors for thumb-1 mode. * coff.h (JUMP_TABLES_IN_TEXT_SECTION): Thumb-1 jump tables are now in the text seciton when PIC or optimizing for size. * elf.h (JUMP_TABLES_IN_TEXT_SECTION): Likewise. * lib1funcs.asm ([__ARM_EABI__]): Add an attribute describing stack preservation properties of code. (__gnu_thumb1_case_sqi, __gnu_thumb1_case_uqi): New functions. (__gnu_thumb1_case_shi, __gnu_thumb1_case_uhi): New functions. (__gnu_thumb1_case_si): New function. * t-arm (LIB1ASMSRC): Define here. (LIB1ASMFUNCS): Add some common functions. * t-arm-elf (LIB1ASMSRC): Delete. (LIB1ASMFUNCS): Append to existing set. * t-pe (LIB1ASMSRC, LIB1ASMFUNCS): Likewise. * t-strongarm-elf (LIB1ASMSRC, LIB1ASMFUNCS): Likewise. * t-symbian (LIB1ASMFUNCS): Likewise. * t-vxworks (LIB1ASMSRC, LIB1ASMFUNCS): Likewise. * t-wince-pe (LIB1ASMSRC, LIB1ASMFUNCS): Likewise. Change-Id: I293661cd65b60854b485326a003a474b59104eeb
-rw-r--r--gcc-4.4.3/gcc/config/arm/lib1funcs.asm105
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-arm3
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-arm-coff3
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-arm-elf3
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-pe3
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-strongarm-elf3
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-symbian2
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-vxworks3
-rw-r--r--gcc-4.4.3/gcc/config/arm/t-wince-pe3
9 files changed, 115 insertions, 13 deletions
diff --git a/gcc-4.4.3/gcc/config/arm/lib1funcs.asm b/gcc-4.4.3/gcc/config/arm/lib1funcs.asm
index e59af4d66..75d206067 100644
--- a/gcc-4.4.3/gcc/config/arm/lib1funcs.asm
+++ b/gcc-4.4.3/gcc/config/arm/lib1funcs.asm
@@ -1590,6 +1590,111 @@ LSYM(Lchange_\register):
#endif /* L_interwork_call_via_rX */
#endif /* !__thumb2__ */
+
+/* Functions to support compact pic switch tables in thumb1 state.
+ All these routines take an index into the table in r0. The
+ table is at LR & ~1 (but this must be rounded up in the case
+ of 32-bit entires). They are only permitted to clobber r12
+ and r14 and r0 must be preserved on exit. */
+#ifdef L_thumb1_case_sqi
+
+ .text
+ .align 0
+ .force_thumb
+ .syntax unified
+ THUMB_FUNC_START __gnu_thumb1_case_sqi
+ push {r1}
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r1, r1, #1
+ ldrsb r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ pop {r1}
+ bx lr
+ SIZE (__gnu_thumb1_case_sqi)
+#endif
+
+#ifdef L_thumb1_case_uqi
+
+ .text
+ .align 0
+ .force_thumb
+ .syntax unified
+ THUMB_FUNC_START __gnu_thumb1_case_uqi
+ push {r1}
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r1, r1, #1
+ ldrb r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ pop {r1}
+ bx lr
+ SIZE (__gnu_thumb1_case_uqi)
+#endif
+
+#ifdef L_thumb1_case_shi
+
+ .text
+ .align 0
+ .force_thumb
+ .syntax unified
+ THUMB_FUNC_START __gnu_thumb1_case_shi
+ push {r0, r1}
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r0, r0, #1
+ lsls r1, r1, #1
+ ldrsh r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ pop {r0, r1}
+ bx lr
+ SIZE (__gnu_thumb1_case_shi)
+#endif
+
+#ifdef L_thumb1_case_uhi
+
+ .text
+ .align 0
+ .force_thumb
+ .syntax unified
+ THUMB_FUNC_START __gnu_thumb1_case_uhi
+ push {r0, r1}
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r0, r0, #1
+ lsls r1, r1, #1
+ ldrh r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ pop {r0, r1}
+ bx lr
+ SIZE (__gnu_thumb1_case_uhi)
+#endif
+
+#ifdef L_thumb1_case_si
+
+ .text
+ .align 0
+ .force_thumb
+ .syntax unified
+ THUMB_FUNC_START __gnu_thumb1_case_si
+ push {r0, r1}
+ mov r1, lr
+ adds.n r1, r1, #2 /* Align to word. */
+ lsrs r1, r1, #2
+ lsls r0, r0, #2
+ lsls r1, r1, #2
+ ldr r0, [r1, r0]
+ adds r0, r0, r1
+ mov lr, r0
+ pop {r0, r1}
+ mov pc, lr /* We know we were called from thumb code. */
+ SIZE (__gnu_thumb1_case_si)
+#endif
+
#endif /* Arch supports thumb. */
#ifndef __symbian__
diff --git a/gcc-4.4.3/gcc/config/arm/t-arm b/gcc-4.4.3/gcc/config/arm/t-arm
index 96e4e49a7..82bd4459a 100644
--- a/gcc-4.4.3/gcc/config/arm/t-arm
+++ b/gcc-4.4.3/gcc/config/arm/t-arm
@@ -15,6 +15,9 @@ MD_INCLUDES= $(srcdir)/config/arm/arm-tune.md \
$(srcdir)/config/arm/neon.md \
$(srcdir)/config/arm/thumb2.md
+LIB1ASMSRC = arm/lib1funcs.asm
+LIB1ASMFUNCS = _thumb1_case_sqi _thumb1_case_uqi _thumb1_case_shi \
+ _thumb1_case_uhi _thumb1_case_si
s-config s-conditions s-flags s-codes s-constants s-emit s-recog s-preds \
s-opinit s-extract s-peep s-attr s-attrtab s-output: $(MD_INCLUDES)
diff --git a/gcc-4.4.3/gcc/config/arm/t-arm-coff b/gcc-4.4.3/gcc/config/arm/t-arm-coff
index 04880833e..156be670f 100644
--- a/gcc-4.4.3/gcc/config/arm/t-arm-coff
+++ b/gcc-4.4.3/gcc/config/arm/t-arm-coff
@@ -1,5 +1,4 @@
-LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
# We want fine grained libraries, so use the new code to build the
# floating point emulation libraries.
diff --git a/gcc-4.4.3/gcc/config/arm/t-arm-elf b/gcc-4.4.3/gcc/config/arm/t-arm-elf
index 5b812b750..3a0ebc3c5 100644
--- a/gcc-4.4.3/gcc/config/arm/t-arm-elf
+++ b/gcc-4.4.3/gcc/config/arm/t-arm-elf
@@ -1,9 +1,8 @@
-LIB1ASMSRC = arm/lib1funcs.asm
# For most CPUs we have an assembly soft-float implementations.
# However this is not true for ARMv6M. Here we want to use the soft-fp C
# implementation. The soft-fp code is only build for ARMv6M. This pulls
# in the asm implementation for other CPUs.
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
_call_via_rX _interwork_call_via_rX \
_lshrdi3 _ashrdi3 _ashldi3 \
_arm_negdf2 _arm_addsubdf3 _arm_muldivdf3 _arm_cmpdf2 _arm_unorddf2 \
diff --git a/gcc-4.4.3/gcc/config/arm/t-pe b/gcc-4.4.3/gcc/config/arm/t-pe
index abd9b39a0..0ae1cdda3 100644
--- a/gcc-4.4.3/gcc/config/arm/t-pe
+++ b/gcc-4.4.3/gcc/config/arm/t-pe
@@ -1,5 +1,4 @@
-LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX \
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX \
_interwork_call_via_rX _clzsi2 _clzdi2 _muldi3
# We want fine grained libraries, so use the new code to build the
diff --git a/gcc-4.4.3/gcc/config/arm/t-strongarm-elf b/gcc-4.4.3/gcc/config/arm/t-strongarm-elf
index efd07dd77..8dc0014ba 100644
--- a/gcc-4.4.3/gcc/config/arm/t-strongarm-elf
+++ b/gcc-4.4.3/gcc/config/arm/t-strongarm-elf
@@ -1,5 +1,4 @@
-LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _clzsi2 \
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _clzsi2 \
_clzdi2 _muldi3
# We want fine grained libraries, so use the new code to build the
diff --git a/gcc-4.4.3/gcc/config/arm/t-symbian b/gcc-4.4.3/gcc/config/arm/t-symbian
index fdd2b7533..6a204642b 100644
--- a/gcc-4.4.3/gcc/config/arm/t-symbian
+++ b/gcc-4.4.3/gcc/config/arm/t-symbian
@@ -1,4 +1,4 @@
-LIB1ASMFUNCS = _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 \
+LIB1ASMFUNCS += _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 \
_muldi3
# These functions have __aeabi equivalents and will never be called by GCC.
diff --git a/gcc-4.4.3/gcc/config/arm/t-vxworks b/gcc-4.4.3/gcc/config/arm/t-vxworks
index b3e86572c..0310759a8 100644
--- a/gcc-4.4.3/gcc/config/arm/t-vxworks
+++ b/gcc-4.4.3/gcc/config/arm/t-vxworks
@@ -1,5 +1,4 @@
-LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
_call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 _muldi3
# We want fine grained libraries, so use the new code to build the
diff --git a/gcc-4.4.3/gcc/config/arm/t-wince-pe b/gcc-4.4.3/gcc/config/arm/t-wince-pe
index 9196e5e5d..31233337a 100644
--- a/gcc-4.4.3/gcc/config/arm/t-wince-pe
+++ b/gcc-4.4.3/gcc/config/arm/t-wince-pe
@@ -1,5 +1,4 @@
-LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX \
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX \
_interwork_call_via_rX _clzsi2 _clzdi2 _muldi3
# We want fine grained libraries, so use the new code to build the