[llvm-dev] [ARM/Thumb] Make a function in arm while in Thumb triple

Evgeny Astigeevich via llvm-dev llvm-dev at lists.llvm.org
Tue May 2 07:00:57 PDT 2017


Hi,

>> __attribute__((target("no-thumb-mode")))
>> __attribute__((target("thumb-mode")))
> Just curious. Why not provide target("arm") and target("thumb")?​

I think there is no code converting them into corresponding target("no-thumb-mode") and target("thumb-mode") in the frontend.

> I don't know if I am reading this wrong (not try this by myself)​. I see you apply target("no-thumb-mode") attribute on function foo, yet foo's attribute #0 has -thumb-mode? Seems to be contradiction?

In target-features “+attribute” means it is turned on, “-attribute” means it is turned off.

Thanks,
Evgeny

From: 陳韋任 [mailto:chenwj.cs97g at g2.nctu.edu.tw]
Sent: Tuesday, May 02, 2017 2:55 PM
To: Evgeny Astigeevich
Cc: Dimitri Tavan; llvm-dev; nd
Subject: Re: [llvm-dev] [ARM/Thumb] Make a function in arm while in Thumb triple



2017-05-02 21:47 GMT+08:00 Evgeny Astigeevich via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>>:
Hi Dimitri,

As I know the following ACLE attributes are not supported in Clang/LLVM at the moment:

__attribute__((target("arm"))) attribute
__attribute__((target("thumb"))) attribute

But there is a workaround:

__attribute__((target("no-thumb-mode")))
__attribute__((target("thumb-mode")))

Just curious. Why not provide target("arm") and target("thumb")?​


The attributes are propagated to a function declaration in IR by the frontend and the backend generated the code according to them:

$ cat test.c
    __attribute__((target("no-thumb-mode"))) int foo(void)
    {
        return 0;
    }
    int main(void)
    {
        return foo();
    }

$ clang -nostdlib -target armv4t-none-eabi -mthumb -c test.c -emit-llvm -S -o -
; ModuleID = 'test.c'
source_filename = "test.c"
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "thumbv4t-none--eabi"

; Function Attrs: noinline nounwind
define i32 @foo() #0 {
  ret i32 0
}

; Function Attrs: noinline nounwind
define i32 @main() #1 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  %2 = call i32 @foo()
 ret i32 %2
}

attributes #0 = { noinline nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="arm7tdmi" "target-features"="+soft-float-abi,+strict-align,-thumb-mode" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { noinline nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="arm7tdmi" "target-features"="+strict-align" "unsafe-fp-math"="false" "use-soft-float"="false" }

​I don't know if I am reading this wrong (not try this by myself)​. I see you apply target("no-thumb-mode") attribute on function foo, yet foo's attribute #0 has -thumb-mode? Seems to be contradiction?

Regards,
chenwj


--
Wei-Ren Chen (陳韋任)
Homepage: https://people.cs.nctu.edu.tw/~chenwj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170502/c8f806f7/attachment.html>


More information about the llvm-dev mailing list