[cfe-dev] how to make llvm_any_pointer match pointer in any address space

Friedman, Eli via cfe-dev cfe-dev at lists.llvm.org
Thu Jul 13 14:37:23 PDT 2017


On 7/13/2017 6:19 AM, Liu winter via cfe-dev wrote:
> Hi, I am trying to add address space in my backend. I have added an intrinsic:
>
>          def  int_mytarget_padd : Intrinsic<[], [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyptr_ty], []>;
>
> then in test.c I wrote:
>
>          #define MEM1 __attribute__((address_space(1)))
>          #define MEM2 __attribute__((address_space(2)))
>          #define MEM3 __attribute__((address_space(3)))
>
>          void llvm_mytarget_padd(void *dst, void *op1, void* op2) asm("llvm.mytarget_padd");

Don't do this; it's a bug that this gets lowered to an LLVM intrinsic.

>          int func(int MEM3 *c, int MEM2 *a, int MEM2 *b) {
>              llvm_mytarget_padd(c, a, b);
>              return 0;
>         }
>
> Errors occured:
>
>         passing '__attribute__((address_space(1))) int *' to parameter of type 'void *' changes address space of pointer
>
> I change argument to `void MEM3 *dst, void MEM1 *op1, void MEM2*op2` in declaration of `llvm_mytarget_padd`, then compilation complete.
> I want to make each parameter of `llvm_mytarget_padd` be of any address space , any suggestion?

The correct way to define a clang builtin is in Builtins.def, or one of 
related files for target-specific builtins like BuiltinsX86.def. If your 
builtin has a type that can't be expressed in a straightforward way in 
C, you can mark it with the "t" flag, and write custom type-checking 
code in SemaChecking.cpp.

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project




More information about the cfe-dev mailing list