From e1da3f5b9645750e966e471ff0db480d6450dcb7 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Wed, 29 Nov 2006 17:53:39 +0000 Subject: [PATCH] 2006-11-29 Paul Brook gas/ * config/tc-arm.c (arm_is_eabi): New function. * config/tc-arm.h (arm_is_eabi): New prototype. (THUMB_IS_FUNC): Use ELF function type for EABI objects. * doc/c-arm.texi (.thumb_func): Update documentation. --- gas/ChangeLog | 7 +++++++ gas/config/tc-arm.c | 6 ++++++ gas/config/tc-arm.h | 13 +++++++++++++ gas/doc/c-arm.texi | 3 +++ 4 files changed, 29 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index e21af06787..d8066c4f12 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2006-11-29 Paul Brook + + * config/tc-arm.c (arm_is_eabi): New function. + * config/tc-arm.h (arm_is_eabi): New prototype. + (THUMB_IS_FUNC): Use ELF function type for EABI objects. + * doc/c-arm.texi (.thumb_func): Update documentation. + 2006-11-29 Paul Brook * config/tc-arm.c (do_vfp_sp_const, do_vfp_dp_const): Fix operans diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 7f3751d894..8ea3ad198b 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -232,6 +232,12 @@ static int meabi_flags = EABI_DEFAULT; # else static int meabi_flags = EF_ARM_EABI_UNKNOWN; # endif + +bfd_boolean +arm_is_eabi(void) +{ + return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4); +} #endif #ifdef OBJ_ELF diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h index 56ceec4ef3..591d496d6c 100644 --- a/gas/config/tc-arm.h +++ b/gas/config/tc-arm.h @@ -100,6 +100,7 @@ extern int arm_optimize_expr (expressionS *, operatorT, expressionS *); #ifdef OBJ_ELF #define md_end arm_md_end extern void arm_md_end (void); +bfd_boolean arm_is_eabi (void); #endif /* NOTE: The fake label creation in stabs.c:s_stab_generic() has @@ -122,7 +123,19 @@ extern void arm_md_end (void); #define ARM_IS_THUMB(s) (ARM_GET_FLAG (s) & ARM_FLAG_THUMB) #define ARM_IS_INTERWORK(s) (ARM_GET_FLAG (s) & ARM_FLAG_INTERWORK) +#ifdef OBJ_ELF + +/* For ELF objects THUMB_IS_FUNC is inferred from + ARM_IS_TUMB and the function type. */ +#define THUMB_IS_FUNC(s) \ + ((arm_is_eabi () \ + && (ARM_IS_THUMB (s)) \ + && (symbol_get_bfdsym (s)->flags & BSF_FUNCTION)) \ + || (ARM_GET_FLAG (s) & THUMB_FLAG_FUNC)) + +#else #define THUMB_IS_FUNC(s) (ARM_GET_FLAG (s) & THUMB_FLAG_FUNC) +#endif #define ARM_SET_THUMB(s,t) ((t) ? ARM_SET_FLAG (s, ARM_FLAG_THUMB) : ARM_RESET_FLAG (s, ARM_FLAG_THUMB)) #define ARM_SET_INTERWORK(s,t) ((t) ? ARM_SET_FLAG (s, ARM_FLAG_INTERWORK) : ARM_RESET_FLAG (s, ARM_FLAG_INTERWORK)) diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index 2fea463c54..a3db1df910 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -429,6 +429,9 @@ between Arm and Thumb instructions and should be used even if interworking is not going to be performed. The presence of this directive also implies @code{.thumb} +This directive is not neccessary when generating EABI objects. On these +targets the encoding is implicit when generating Thumb code. + @cindex @code{thumb_set} directive, ARM @item .thumb_set This performs the equivalent of a @code{.set} directive in that it