This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: arm thumb interworking funkyness.


Duane Ellis wrote:
Hello,

I'm trying to write a small bit of ARM asm, that is callable from mixed code.

that is: I don't want the LD to create a "_from_thumb" symbol (wrapper) for it.
I want to include that in my hand written assembler code.


GCC version: gcc version 4.1.2
binutils version 2.17

C code is compiled with -mcpu=arm7tdmi -mthumb -mthumb-interwork
ASM code is (really .S, through GCC) is compiled with the same options.

In C, code, I'm doing this:

  void
  my_function( void )
 {       printf("Turn interrupts on\n");
      ARM_enable_IRQ();
      process_run();
  }

After linking, instead of calling my ARM/THUMB code, I get this in the disassembly output:

 200558:    f001 f962     bl    201820 <printf>
 20055c:    f007 f9c6     bl    2078ec <____floatsidf_from_thumb>
 200560:    f000 f8e8     bl    200734 <process_run>
Can you make sure that you are looking at the right location in the disassembly. From what you provided it works correctly. You might have to give more information if you still are stuck.



yea, it is literally calling the *WRONG* function.


The Assembler code (a .S file) looks like this:

#define DUAL_HEAD( X )  \
   .global    __ ## X ## _from_thumb     ; \
   .code 16             ; \
   .thumb_func            ; \
   .type    __ ## X ## _from_thumb,function ;  \
__ ## X  ## _from_thumb:            ; \
   bx    pc             ; \
   nop                ; \
   .global    X             ; \
   .type    X ,function         ; \
   .code 32            ; \
X :                    ; \

   DUAL_HEAD( ARM_disable_IRQ    )
   mrs    r0,cpsr
   orr    r1,r0,#I_BIT
   msr    cpsr_c,r1
   bx    lr
   .size    ARM_disable_IRQ,(.-ARM_disable_IRQ)

==========================

From what I can see, I believe I'm constructing the veneer correctly.
But -- Either I'm doing something wrong or - there's a bug in the linker.
I suspect it is me... But... well, I'm not getting anywhere.

==========================

Any suggestions?

Sadly, It is not very simple to reduce this to a _small_ set of code.


--Duane.




--
For unsubscribe information see http://sourceware.org/lists.html#faq



--
For unsubscribe information see http://sourceware.org/lists.html#faq


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]