[LLVMdev] input and output values from a loop (original) (raw)

Evgeny Astigeevich evgeny.astigeevich at arm.com
Mon Jul 6 05:36:49 PDT 2015


Hi Imran,

Do I understand you correctly you want to have C/C++ names instead of LLVM IR names or in other words to access clang AST from the LLVM context? When you work with LLVM IR everything you see is elements of the LLVM assembly language, not elements of the source language. Yes, clang tries to preserve original names during creation of LLVM IR as much as possible but the names can be changed by LLVM passes. Depending on the specified target structures/functions can be modified or additional elements can be inserted.

You need to enable source level debugging information to have a relationship between IR and the original program source code. You can read about this here:

Source Level Debugging with LLVM: http://llvm.org/docs/SourceLevelDebugging.html C/C++ front-end specific debug information: http://llvm.org/docs/SourceLevelDebugging.html#c-c-front-end-specific-debug- information

Of course you can modify the Clang front-end if this is not enough for you.

Kind regards, Evgeny Astigeevich

-----Original Message----- From: Imran Ashraf [mailto:iimran.aashraf at yahoo.com] Sent: 02 July 2015 19:01 To: Evgeny Astigeevich Subject: Re: [LLVMdev] input and output values from a loop

Dear Evgeny,

Thanks a lot for the quick response. I was struggling with it for quite some time. Using mem2reg solves the problem partially.

By partially i mean, If i have a dynamically allocated array as: //struct Book books[25]; struct Book *books = malloc( 25 * sizeof(struct Book));

I get type as %struct.Book* but name is printed empty. Without mem2reg it does print the name.

Secondly, is there any utility in llvm to pretty print the type as struct Book * instead of %struct.Book* ? Similarly int instead of i32.

Currently I am iterating over values and printing the type on a stream as: (value->getType())->print(COUT);

Kind Regards,

On 02-07-15 19:01, Evgeny Astigeevich wrote:

Hi Imran,

It works correctly. Look at IR: define i32 @aFunc(i32 %par) #0 { entry: %par.addr = alloca i32, align 4 %sum = alloca i32, align 4 %books = alloca [25 x %struct.Book], align 16 %i = alloca i32, align 4 %fact = alloca i32, align 4 store i32 %par, i32* %par.addr, align 4 store i32 0, i32* %sum, align 4 %call = call i32 @puts(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0)) store i32 0, i32* %i, align 4 br label %for.cond for.cond: ; preds = %for.inc, %entry %0 = load i32, i32* %i, align 4 %cmp = icmp slt i32 %0, 10 br i1 %cmp, label %for.body, label %for.end for.body: ; preds = %for.cond %1 = load i32, i32* %par.addr, align 4 %mul = mul nsw i32 %1, 2 store i32 %mul, i32* %fact, align 4 %2 = load i32, i32* %sum, align 4 %3 = load i32, i32* %i, align 4 %add = add nsw i32 %2, %3 %4 = load i32, i32* %fact, align 4 %add1 = add nsw i32 %add, %4 store i32 %add1, i32* %sum, align 4 %5 = load i32, i32* %i, align 4 %6 = load i32, i32* %i, align 4 %idxprom = sext i32 %6 to i64 %arrayidx = getelementptr inbounds [25 x %struct.Book], [25 x %struct.Book]* %books, i32 0, i64 %idxprom %pages = getelementptr inbounds %struct.Book, %struct.Book* %arrayidx, i32 0, i32 0 store i32 %5, i32* %pages, align 4 br label %for.inc for.inc: ; preds = %for.body %7 = load i32, i32* %i, align 4 %inc = add nsw i32 %7, 1 store i32 %inc, i32* %i, align 4 br label %for.cond for.end: ; preds = %for.cond %8 = load i32, i32* %sum, align 4 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i32 %8) %9 = load i32, i32* %sum, align 4 ret i32 %9 } You can see they are defined in Entry before the loop: %sum = alloca i32, align 4 %i = alloca i32, align 4 %fact = alloca i32, align 4 In the loop they are used as: %2 = load i32, i32* %sum, align 4 store i32 %add1, i32* %sum, align 4 %7 = load i32, i32* %i, align 4 store i32 %inc, i32* %i, align 4 Nothing defined in the loop is used outside the loop. You recommend to add '-mem2reg'. Kind regards, Evgeny Astigeevich -----Original Message----- From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Imran Ashraf Sent: 02 July 2015 17:40 To: llvmdev at cs.uiuc.edu Subject: [LLVMdev] input and output values from a loop Hi there, I want to get input and output values from a loop. For this I am doing something like this: DominatorTree &DT = getAnalysis().getDomTree(); CodeExtractor Extractor(DT, *L); Extractor.findInputsOutputs(inputs, outputs); When I print the input and output values for the following test code: void aFunc(void) { int sum=0; puts("aFunc()"); for (int i = 0; i < 10; i++) { int fact=i*2; sum=sum+i+fact; } printf("%d",sum); } I get the following: Inputs type i32* name i type i32* name fact type i32* name sum Outputs However, I was expecting the output to be: Inputs type i32* name sum Outputs type i32* name sum To my understanding, i and fact are declared inside the loop, hence they are neither input nor output. Secondly, sum is being used outside the loop, hence should appear in outputs. Is this the right way of doing it or am i doing some thing wrong? Complete working code can be found at: https://github.com/imranashraf/llvm-pass-exercise1 Thanks in advance for help. Kind regards,


LLVM Developers mailing list LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev



More information about the llvm-dev mailing list