Hi Ashi, Your first LDR is a pseudoinstruction that is supported by some tools (gas and armasm, at least), but not by LLVM. Roughly speaking, it turns into a PC-relative load from a literal pool. To do what you're trying to achieve you can write your own literal pool in your assembly. You can see some examples of this sort of thing at https://github.com/tianocore/edk2/blob/master/ArmPkg/Include/AsmMacroIoLib.h. Regards, Bernie From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Ashi Sent: 05 March 2013 04:27 To: Renato Golin Cc: LLVM List Subject: Re: [LLVMdev] ARM assembler's syntax in clang Hi, all. The previous post have a typo: problem in ARM assembly: I use LDR to load an external symbol : LDR R7,=DataTable But clang gives error: unexpected token in operand to the '=', Then I change the code to: LDR R7,DataTable The error becomes: unsupported relocation on symbol. How can I get around this in clang? My problem is actually how to load external symbol in Clang's integrated-as? I've tried to learn some trivial c code's assembly output, but find there are many linker related symbol and really confusing. Thanks in advance! On Mon, Mar 4, 2013 at 4:48 PM, Ashi <ashi08104 at gmail.com> wrote: Hi, all. Another problem in ARM assembly: I use LDR to load an external symbol : LDR R7,=DataTable But clang gives error: unexpected token in operand to the '=', Then I change the code to: LDR R7,=DataTable The error becomes: unsupported relocation on symbol. How can I get around this in clang? Thanks in advance! On Mon, Feb 25, 2013 at 7:14 PM, Ashi <ashi08104 at gmail.com> wrote: Hi,all, I've some problem when using clang compile my ARM assembly code: 1 .qn directive In GAS, .qn directive is used to create typed and/or indexed register aliases for use in Advanced SIMD Extension (Neon) instructions.(http://sourceware.org/binutils/docs/as/ARM-Directives.html#ARM-Directives) But clang's integrated-as seems have different syntax, for example, my code: input .qn Q6.F32 Clang would give error: unexpected token in argument list 2 .unreq Clang doesn't recognize .unreq, my code is as below: px .req r0 .unreq px px .req r1 clang give error: redefinition of 'px' does not match original. 3 .end clang also doesn't recognize .end directive all my code is compiled by: clang -arch armv7 -v -integrated-as -g -mcpu=cortex-a9 -mfpu=neon -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/ my clang version is: Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) BTW, could any tell me which files implement integrated-as in clang source code, I think it may also help me by looking the source code(I've tried 'grep', but with no success.) Great Thanks! ashi ashi -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130306/9e157370/attachment.html>
Hi, Bernie, Thanks for your reply! However, I still have problem by following edk2's code, my test code is attached, what I want to do is build it as a dynamic lib. But I get error from ld: ld: illegal text-relocation to _data_table in table.o from foo in use_table.o for architecture armv7 Do you have any suggestion to solve this? Thanks! //==begin table.c=int data_table[] = {0xff, 0xff}; //==end table.c= //==begin use_table.s = .text .syntax unified .align 4 .global foo .thumb .thumb_func foo: PUSH {lr} @LDR r0,[PC,#2] .long _data_table POP {pc} //==end use_table.s= //==begin Makefile=CC = /Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang CFLAG = -arch armv7 -mcpu=cortex-a9 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPh oneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk all:libtest.dylib libtest.dylib:table.o use_table.o $(CC) -v -dynamiclib $(CFLAG) $^ -o $@ table.o:table.c $(CC) -c $(CFLAG) $^ -o $@ use_table.o:use_table.s $(CC) -c -integrated-as $(CFLAG) $^ -o $@ clean: rm *.o libtest.dylib test //==end Makefile= Cheers, Ashi On Wed, Mar 6, 2013 at 11:59 PM, Bernie Ogden <bogden at arm.com> wrote:> Hi Ashi,**** > > ** ** > > Your first LDR is a pseudoinstruction that is supported by some tools (gas > and armasm, at least), but not by LLVM. Roughly speaking, it turns into a > PC-relative load from a literal pool.**** > > ** ** > > To do what you're trying to achieve you can write your own literal pool in > your assembly. You can see some examples of this sort of thing at > https://github.com/tianocore/edk2/blob/master/ArmPkg/Include/AsmMacroIoLib.h > .**** > > ** ** > > Regards,**** > > ** ** > > Bernie**** > > ** ** > > ** ** > > *From:* llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] *On > Behalf Of *Ashi > *Sent:* 05 March 2013 04:27 > *To:* Renato Golin > *Cc:* LLVM List > *Subject:* Re: [LLVMdev] ARM assembler's syntax in clang**** > > ** ** > > Hi, all. The previous post have a typo: > > problem in ARM assembly: I use LDR to load an external symbol : > > LDR R7,=DataTable > > But clang gives error: unexpected token in operand to the '=', > Then I change the code to: > > LDR R7,DataTable > > The error becomes: unsupported relocation on symbol. How can I get around > this in clang? My problem is actually how to load external symbol in > Clang's integrated-as? I've tried to learn some trivial c code's assembly > output, but find there are many linker related symbol and really confusing. > > Thanks in advance! > > **** > > ** ** > > On Mon, Mar 4, 2013 at 4:48 PM, Ashi <ashi08104 at gmail.com> wrote:**** > > Hi, all. Another problem in ARM assembly: I use LDR to load an external > symbol : > > LDR R7,=DataTable > > But clang gives error: unexpected token in operand to the '=', > Then I change the code to: > > LDR R7,=DataTable > > The error becomes: unsupported relocation on symbol. How can I get around > this in clang? > > Thanks in advance!**** > > ** ** > > On Mon, Feb 25, 2013 at 7:14 PM, Ashi <ashi08104 at gmail.com> wrote:**** > > Hi,all, > I've some problem when using clang compile my ARM assembly code: > > 1 .qn directive > In GAS, .qn directive is used to create typed and/or indexed register > aliases for use in Advanced SIMD Extension (Neon) instructions.( > http://sourceware.org/binutils/docs/as/ARM-Directives.html#ARM-Directives) > But clang's integrated-as seems have different syntax, for example, my > code: > > input .qn Q6.F32 > > Clang would give error: unexpected token in argument list > > 2 .unreq > Clang doesn't recognize .unreq, my code is as below: > > px .req r0 > .unreq px > px .req r1 > > clang give error: redefinition of 'px' does not match original. > > 3 .end > clang also doesn't recognize .end directive > > all my code is compiled by: clang -arch armv7 -v -integrated-as -g > -mcpu=cortex-a9 -mfpu=neon -isysroot > /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/ > > my clang version is: Apple LLVM version 4.2 (clang-425.0.24) (based on > LLVM 3.2svn) > > BTW, could any tell me which files implement integrated-as in clang source > code, I think it may also help me by looking the source code(I've tried > 'grep', but with no success.) > > Great Thanks! > > ashi**** > > ashi**** > > ** ** >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130307/a66b2cf3/attachment.html>
Not sure, but I would try: 1. Are the objects being linked in the right order? 2. Is the symbol name _data_table correct? 3. You may need to explicitly tell your use_table.s file about the existence of data_table. In armasm I would have an 'import' statement to achieve this, not sure about clang/gas. You also need to return from foo _before_ you execute '.long _data_table'. And be warned that the PC doesn't point at the next instruction when you use it like this - I believe you don't need to modify it at all if you swap the pop and the .long. From: Ashi [mailto:ashi08104 at gmail.com] Sent: 07 March 2013 11:39 To: Bernard Ogden Cc: Renato Golin; LLVM List Subject: Re: [LLVMdev] ARM assembler's syntax in clang Hi, Bernie, Thanks for your reply! However, I still have problem by following edk2's code, my test code is attached, what I want to do is build it as a dynamic lib. But I get error from ld: ld: illegal text-relocation to _data_table in table.o from foo in use_table.o for architecture armv7 Do you have any suggestion to solve this? Thanks! //==begin table.c=int data_table[] = {0xff, 0xff}; //==end table.c= //==begin use_table.s = .text .syntax unified .align 4 .global foo .thumb .thumb_func foo: PUSH {lr} @LDR r0,[PC,#2] .long _data_table POP {pc} //==end use_table.s= //==begin Makefile=CC = /Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang CFLAG = -arch armv7 -mcpu=cortex-a9 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPh oneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk all:libtest.dylib libtest.dylib:table.o use_table.o $(CC) -v -dynamiclib $(CFLAG) $^ -o $@ table.o:table.c $(CC) -c $(CFLAG) $^ -o $@ use_table.o:use_table.s $(CC) -c -integrated-as $(CFLAG) $^ -o $@ clean: rm *.o libtest.dylib test //==end Makefile= Cheers, Ashi On Wed, Mar 6, 2013 at 11:59 PM, Bernie Ogden <bogden at arm.com> wrote: Hi Ashi, Your first LDR is a pseudoinstruction that is supported by some tools (gas and armasm, at least), but not by LLVM. Roughly speaking, it turns into a PC-relative load from a literal pool. To do what you're trying to achieve you can write your own literal pool in your assembly. You can see some examples of this sort of thing at https://github.com/tianocore/edk2/blob/master/ArmPkg/Include/AsmMacroIoLib.h. Regards, Bernie From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Ashi Sent: 05 March 2013 04:27 To: Renato Golin Cc: LLVM List Subject: Re: [LLVMdev] ARM assembler's syntax in clang Hi, all. The previous post have a typo: problem in ARM assembly: I use LDR to load an external symbol : LDR R7,=DataTable But clang gives error: unexpected token in operand to the '=', Then I change the code to: LDR R7,DataTable The error becomes: unsupported relocation on symbol. How can I get around this in clang? My problem is actually how to load external symbol in Clang's integrated-as? I've tried to learn some trivial c code's assembly output, but find there are many linker related symbol and really confusing. Thanks in advance! On Mon, Mar 4, 2013 at 4:48 PM, Ashi <ashi08104 at gmail.com> wrote: Hi, all. Another problem in ARM assembly: I use LDR to load an external symbol : LDR R7,=DataTable But clang gives error: unexpected token in operand to the '=', Then I change the code to: LDR R7,=DataTable The error becomes: unsupported relocation on symbol. How can I get around this in clang? Thanks in advance! On Mon, Feb 25, 2013 at 7:14 PM, Ashi <ashi08104 at gmail.com> wrote: Hi,all, I've some problem when using clang compile my ARM assembly code: 1 .qn directive In GAS, .qn directive is used to create typed and/or indexed register aliases for use in Advanced SIMD Extension (Neon) instructions.(http://sourceware.org/binutils/docs/as/ARM-Directives.html#ARM-Directives) But clang's integrated-as seems have different syntax, for example, my code: input .qn Q6.F32 Clang would give error: unexpected token in argument list 2 .unreq Clang doesn't recognize .unreq, my code is as below: px .req r0 .unreq px px .req r1 clang give error: redefinition of 'px' does not match original. 3 .end clang also doesn't recognize .end directive all my code is compiled by: clang -arch armv7 -v -integrated-as -g -mcpu=cortex-a9 -mfpu=neon -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/ my clang version is: Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) BTW, could any tell me which files implement integrated-as in clang source code, I think it may also help me by looking the source code(I've tried 'grep', but with no success.) Great Thanks! ashi ashi -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130307/09fc90d2/attachment.html>
Hi Ashi,> ld: illegal text-relocation to _data_table in table.o from foo in > use_table.o for architecture armv7It looks like you're using iOS. I'm not familiar with the exact workings of that platform, but I think a similar message would occur in ELF-land. If iOS *is* comparable, your issue is that symbols in dynamically loaded objects can't (usually) be referenced directly because the code section (and any embedded litpools) need to be identical no matter where everything is loaded in memory. This is most of the point of .dylib files: the instructions only have to exist once in memory and can be shared. If the bytes would be different for each user that's not possible -- the linker spots places where that happens and gives an error. My advice would be to compile a .c file (with "-S" to view the assembly) which makes accesses like you're trying to do and copy its code. There's no shame in it: I had a good idea of what ELF did but still got the syntactic details wrong when I tried to write similar code off the top of my head. In this case, for example, I'd compile the C code (with "-fPIC" in principle, though it seems to make no difference here. Actually, I'm rather disturbed that you're trying to compile the C part of a .dylib without "-fPIC". In the Linux world that's a no-no. Could be valid for iOS, but I'd suggest you make sure if you don't know): extern int data_table[]; int *wheres_data_table(void) { return &data_table[0]; } (N.b. "armv7" uses a movw/movt pair which is perfectly valid. If you want to see how to do it using litpools, you need to compile for "armv6" which doesn't have those instructions). Cheers. Tim.