From 954a4ce00a0a2a93c783c30141e9703cca2442f6 Mon Sep 17 00:00:00 2001 From: Andrew Hsieh Date: Tue, 27 Nov 2012 14:48:18 +0800 Subject: 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 --- gcc-4.4.3/gcc/config/arm/lib1funcs.asm | 105 +++++++++++++++++++++++++++++++ gcc-4.4.3/gcc/config/arm/t-arm | 3 + gcc-4.4.3/gcc/config/arm/t-arm-coff | 3 +- gcc-4.4.3/gcc/config/arm/t-arm-elf | 3 +- gcc-4.4.3/gcc/config/arm/t-pe | 3 +- gcc-4.4.3/gcc/config/arm/t-strongarm-elf | 3 +- gcc-4.4.3/gcc/config/arm/t-symbian | 2 +- gcc-4.4.3/gcc/config/arm/t-vxworks | 3 +- gcc-4.4.3/gcc/config/arm/t-wince-pe | 3 +- 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 -- cgit v1.2.3