[cfe-dev] Variable declaration on custom target
Eli Friedman
eli.friedman at gmail.com
Wed Nov 10 13:09:10 PST 2010
On Wed, Nov 10, 2010 at 12:18 PM, Lorenzo De Carli <lorenzo at cs.wisc.edu> wrote:
> Hi list,
>
> I am working on a custom 16-bit target for Clang. I have defined an
> appropriate TargetInfo object in Targets.cpp, and I am able to get
> 16-bit LLVM assembly from Clang. However, I noticed that variables
> declared in a function body are treated differently when compiling for
> X86 and for my architecture. In particular, on X86 such variables are
> treated as virtual registers while on the custom target they are
> declared as auto-variables. For example, if I compile the following
> code:
>
> int myfunc(int param) {
> int val;
> int result;
>
> val = 5;
> result = val * param;
>
> return result;
> }
>
> on X86 I get:
>
> ; ModuleID = 'myfunc.c'
> target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
> target triple = "x86_64-unknown-linux-gnu"
>
> define i32 @myfunc(i32 %param) nounwind {
> %1 = alloca i32, align 4
> %val = alloca i32, align 4
> %result = alloca i32, align 4
> store i32 %param, i32* %1, align 4
> store i32 5, i32* %val, align 4
> %2 = load i32* %val, align 4
> %3 = load i32* %1, align 4
> %4 = mul nsw i32 %2, %3
> store i32 %4, i32* %result, align 4
> %5 = load i32* %result, align 4
> ret i32 %5
> }
>
> while on my custom target I get:
>
> target datalayout =
> "e-p:16:16:16-i16:16:16-f16:16:16-n16:16:16-v16:16:16-a16:16:16"
> target triple = "myarch-myvendor-myos"
>
> @myfunc.auto.val = internal global i16 0, align 2
> @myfunc.auto.result = internal global i16 0, align 2
>
> define i16 @myfunc(i16 %param) nounwind {
> %1 = alloca i16, align 2
> store i16 %param, i16* %1, align 2
> store i16 5, i16* @myfunc.auto.val, align 2
> %2 = load i16* @myfunc.auto.val, align 2
> %3 = load i16* %1, align 2
> %4 = mul nsw i16 %2, %3
> store i16 %4, i16* @myfunc.auto.result, align 2
> %5 = load i16* @myfunc.auto.result, align 2
> ret i16 %5
> }
>
> Could someone explain why this is happening? (I already asked a
> similar question on LLVM-dev, but Eli recommended
> me to re-post on cfe-dev).
Oh, that looks like you copy-pasted the
"useGlobalsForAutomaticVariables()" definition from the PIC16 target.
You're not really describing the problem accurately though; they're
globals, not virtual registers.
-Eli
More information about the cfe-dev
mailing list