Issue 162084
Summary cmse: no `__acle_se_` symbol is generated for aliases
Labels new issue
Assignees
Reporter folkertdev
    This code 

https://godbolt.org/z/nxnK4PWj9

```llvm
@foo = unnamed_addr alias void (), ptr @bar

define dso_local void @bar() unnamed_addr #0 {
start:
 ret void
}

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) "cmse_nonsecure_entry" "frame-pointer"="all" "target-cpu"="generic" }
```

generates this assembly

```
__acle_se_bar:
bar:
        push    {r7, lr}
        mov r7, sp
        pop.w   {r7, lr}
        mov     r0, lr
        mov r1, lr
        mov     r2, lr
        mov     r3, lr
        mov     r12, lr
        msr     apsr_nzcvq, lr
        bxns    lr
foo = bar
```

The bodies are merged (fine) but no `__acle_se_` symbol is generated for `foo` (bad!).

It looks like clang specifically marks `cmse-nonsecure-entry` functions as `local_unnamed_addr` to circumvent this problem, see https://godbolt.org/z/qh55KPzzs. In `rustc` we don't really want to do that, and don't see a technical reason why generating merging the definitions would not work.

---

My suggestion is to also generate the symbol for any aliases to a function marked as cmse. I'm not sure yet if there is a convenient way to do that currently. 

The linker is able to handle such input. For instance, when we modify the input 

```llvm
@foo = unnamed_addr alias void (), ptr @bar
@"__acle_se_foo" = unnamed_addr alias void (), ptr @bar

define dso_local void @bar() unnamed_addr #0 {
start:
 ret void
}
```

Then compile to `.o` and then `.elf`

```
llc -mtriple=thumbv8m.main-none-eabi -mattr=+8msecext,+thumb-mode -filetype=obj foo.ll -o foo.o
arm-none-eabi-gcc -mcpu=cortex-m33 -mthumb -mcmse -nostartfiles -nostdlib foo.o -Wl,--cmse-implib -Wl,--out-implib,veneers.o 
```

The linker invocation fails because we really need a linker script here, but the veneer file does contain both symbols

```
> llvm-objdump -td veneers.o

veneers.o:	file format elf32-littlearm

SYMBOL TABLE:
00008001 g     F *ABS*	00000010 foo
00008001 g     F *ABS*	00000010 bar
```

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to