[LLVMdev] alloca & store generation
John Criswell
criswell at cs.uiuc.edu
Tue Mar 6 08:13:24 PST 2007
Ryan M. Lefever wrote:
> After looking at this problem longer, I believe that there is something
> wrong with the disassembler. When I run my transformation and then
> disassemble the output, I get bytecode that looks like:
>
> -----
> int %main(int %argc, sbyte** %argv) {
> entry:
> alloca int ; <int*>:0 [#uses=3]
> alloca sbyte** ; <sbyte***>:0 [#uses=3]
> store int %argc, int* %0
> store sbyte** %argv, sbyte*** %0
> call void %F( int* %0, sbyte*** %0, int 1, int 0 )
>
I believe the above bytecode is correct. When an instruction is not
given a name, the compiler assigns it a numeric name. Names are unique
to type (for versions of LLVM <= 1.9), so your first two alloca
instructions are named %0 and could be re-written as follows:
%0 = alloca int
%0 = alloca sbyte **
Hence, the store and call instruction are using the alloca'ed pointers
as intended.
It would probably be nice if the disassembler listed those default
assigned names explicitly. There might be a good motivation for why it
doesn't, but if there is, I don't know the reason.
-- John T.
> -----
>
> However, if I use llc to generate C code from the bytecode that my
> transformation produces, it looks like:
>
> -----
> int main(int ltmp_75_3, signed char **ltmp_76_9) {
> int ltmp_3355_85; /* Address-exposed local */
> signed char **ltmp_3356_105; /* Address-exposed local */
> ...
> *(<mp_3355_85) = ltmp_75_3;
> *(<mp_3356_105) = ltmp_76_9;
> initLogging((<mp_3355_85), (<mp_3356_105), 1, 0);
> -----
>
> The C code is what I intended. That leaves me to believe that my
> transformation produced the correct bytecode, but the dissassembler is
> not properly disassebling the bytecode.
>
> Ryan
>
>
> Ryan M. Lefever wrote:
>
>> I am writing a transformation that needs to add a call to a function F()
>> at the beginning of main() with the addresses of argc and argv as
>> parameters to F(). However, the bytecode file I'm transforming has not
>> allocated space on the stack for argc and argv. So, I developed my
>> transformation to change main() from:
>>
>> -----
>> int main(int %argc, sbyte** %argv){
>> entry:
>> ...
>> // some use of %argc and %argv
>> ...
>> }
>> -----
>>
>> to the following code:
>>
>> -----
>> int main(int %argc, sbyte** %argv){
>> entry:
>> %argc_addr = alloca int
>> %argv_addr = alloca sbyte**
>> store int %argc, int* %argc_addr
>> store sbyte** %argv, sbyte*** %argv_addr
>> call void %F ( int %argc_addr, sbyte*** %argv_addr )
>> %tmp = load int* %argc_addr
>> %tmp1 = load int* %tmp
>> ...
>> // the use of %argc and %argv is transformed to use
>> // %tmp and %tmp1, respectively
>> ...
>> }
>> -----
>>
>> However, after adding the alloca and stores, I print out main it looks like:
>>
>> -----
>> int %main(int %argc, sbyte** %argv) {
>> entry:
>> alloca int ; <int*>:0 [#uses=1]
>> alloca sbyte** ; <sbyte***>:0 [#uses=1]
>> store int %argc, int* %0
>> store sbyte** %argv, sbyte*** %0
>> ...
>> -----
>>
>> I used the following code in my transformation:
>>
>> -----
>> BasicBlock* eb = M.getMainFunction()->getEntryBlock();
>> Function::arg_iterator argc_it = mainfun->arg_begin();
>> Function::arg_iterator argv_it = argc_it;
>> ++argv_it;
>> Argument* argc = &*argc_it;
>> Argument* argv = &*argv_it;
>> Instruction* insertNewInstsBefore = &eb->front();
>> AllocaInst* argc_alloca = new AllocaInst(argc->getType(), "",
>> insertNewInstsBefore);
>> AllocaInst* argv_alloca = new AllocaInst(argv->getType(), "",
>> insertNewInstsBefore);
>> new StoreInst(argc, argc_alloca, false, insertNewInstsBefore);
>> new StoreInst(argv, argv_alloca, false, insertNewInstsBefore);
>> -----
>>
>> Why isn't llvm giving a name to the value returned by the allocas and
>> using it in the store instructions?
>>
>> Regards,
>> Ryan
>> _______________________________________________
>> 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