[cfe-dev] AArch64 ASM / Custom Sections and Common Variables

Joel Winarske via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 11 10:40:35 PST 2019


Hi Oliver,

Great idea.  I'll take this approach.

Thanks,
Joel

On Mon, Nov 11, 2019, 5:36 AM Oliver Stannard <oliver.stannard at linaro.org>
wrote:

> What target (in particular OS, object file format) are you trying to
> assemble for? Your example assembles without error for me with this command
> line:
>   clang --target=aarch64-none-eabi -c test.s -o test.o
>
> That is generating ELF output, it's possible that other formats don't have
> the necessary relocations to represent the first LDR instruction, or LLVM
> doesn't know how to emit them.
>
> It's also worth noting that a single LDR instruction only has a range
> of +-1MiB, which might not be what you want. I often find the easiest way
> to find reasonable assembly sequences is to compile a C file which does
> what you want and look at the assembly output. For example, with this C
> file:
>   long FooValue = 0x0;
>
>   __attribute((section(".text.foo1")))
>   long foo1() {
>     return FooValue;
>   }
>
>   __attribute((section(".text.foo2")))
>   long foo2() {
>     return FooValue;
>   }
>
> clang emits this assembly:
>           .text
>           .file   "test2.c"
>           .section        .text.foo1,"ax", at progbits
>           .globl  foo1                    // -- Begin function foo1
>           .p2align        2
>           .type   foo1, at function
>   foo1:                                   // @foo1
>   // %bb.0:                               // %entry
>           adrp    x8, FooValue
>           ldr     x0, [x8, :lo12:FooValue]
>           ret
>   .Lfunc_end0:
>           .size   foo1, .Lfunc_end0-foo1
>                                           // -- End function
>           .section        .text.foo2,"ax", at progbits
>           .globl  foo2                    // -- Begin function foo2
>           .p2align        2
>           .type   foo2, at function
>   foo2:                                   // @foo2
>   // %bb.0:                               // %entry
>           adrp    x8, FooValue
>           ldr     x0, [x8, :lo12:FooValue]
>           ret
>   .Lfunc_end1:
>           .size   foo2, .Lfunc_end1-foo2
>                                           // -- End function
>           .type   FooValue, at object        // @FooValue
>           .bss
>           .globl  FooValue
>           .p2align        3
>   FooValue:
>           .xword  0                       // 0x0
>           .size   FooValue, 8
>
>           .ident  "clang version 10.0.0 (git at github.com:llvm/llvm-project.git
> 36937ec7fb8e20b81adbac40bd48c6ed7ac6df61)"
>           .section        ".note.GNU-stack","", at progbits
>           .addrsig
>
> Note the use of the ADRP/LDR pair of instructions, which has a range
> of +-4GiB.
>
> Oliver
>
> On Sat, 9 Nov 2019 at 18:26, Joel Winarske via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> What is the proper way to have a variable common between two
>> custom-defined sections?
>>
>> Example:
>>
>>   .global foo1
>>   .section .text.foo1, "ax"
>> foo1:
>>   ldr w0, FooValue
>>   ret
>>
>>   .global foo2
>>   .section .text.foo2, "ax"
>> foo2:
>>   ldr w0, FooValue
>>   ret
>>
>> FooValue: .word 0x00
>>
>> This generates "unsupported relocation type:
>> fixup_aarch64_ldr_pcrel_imm19".  If I comment out the first ldr line, it
>> builds, as FooValue is part of .text.foo2.
>>
>> If I define FooValue twice, once for each section it complains it's
>> already defined.
>>
>>
>> Joel
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20191111/e568b4e1/attachment.html>


More information about the cfe-dev mailing list