[LLVMdev] Another memory fun

Nick Lewycky nicholas at mxc.ca
Sun Jan 6 11:00:49 PST 2008


It's invalid for the same reason that

   char *foobar = strcat("foo", "bar");

is invalid in C. Please make sure you understand what you're asking LLVM 
to do before going any further down this path. A good approach is to 
write out the correct code in C and then use llvm-gcc (or the demo page 
at http://llvm.org/demo ) to see what it looks like in LLVM assembly.

Nick

Zalunin Pavel wrote:
> Hey again)
> 
> Now I have next code:
> 
> ; ModuleID = 'sample.lz'
> @.str1 = internal global [8 x i8] c" world!\00"         ; <[8 x i8]*> 
> [#uses=1]
> @.str2 = internal global [8 x i8] c"hello, \00"         ; <[8 x i8]*> 
> [#uses=1]
> @.str7 = internal global [21 x i8] c"welcome to out hall!\00"           
> ; <[21 x i8]*> [#uses=1]
> 
> declare i32 @puts(i8*)
> 
> declare i8* @strcat(i8*, i8*)
> 
> declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)
> 
> define i32 @main() {
> mainBlock:
>         %.str3 = getelementptr [8 x i8]* @.str2, i64 0, i64 0           
> ; <i8*> [#uses=1]
>         %.str4 = getelementptr [8 x i8]* @.str1, i64 0, i64 0           
> ; <i8*> [#uses=1]
>         %tmp5 = call i8* @strcat( i8* %.str3, i8* %.str4 )              
> ; <i8*> [#uses=1]
>         %tmp6 = call i32 @puts( i8* %tmp5 )             ; <i32> [#uses=0]
>         %.str8 = getelementptr [21 x i8]* @.str7, i64 0, i64 0          
> ; <i8*> [#uses=1]
>         %tmp9 = call i32 @puts( i8* %.str8 )            ; <i32> [#uses=0]
>         ret i32 0
> }
> 
> After compilation I see next(without %):
> 
> %
> hello,  world!
> world!
> 
> what is the trouble now?
> but next code runs ok:
> ; ModuleID = 'sample.lz'
> @.str1 = internal global [7 x i8] c"father\00"          ; <[7 x i8]*> 
> [#uses=1]
> @.str2 = internal global [8 x i8] c"mother \00"         ; <[8 x i8]*> 
> [#uses=1]
> 
> declare i32 @puts(i8*)
> 
> declare i8* @strcat(i8*, i8*)
> 
> declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)
> 
> define i32 @main() {
> mainBlock:
>         %.str3 = getelementptr [8 x i8]* @.str2, i64 0, i64 0           
> ; <i8*> [#uses=1]
>         %.str4 = getelementptr [7 x i8]* @.str1, i64 0, i64 0           
> ; <i8*> [#uses=1]
>         %tmp5 = call i8* @strcat( i8* %.str3, i8* %.str4 )              
> ; <i8*> [#uses=1]
>         %tmp6 = call i32 @puts( i8* %tmp5 )             ; <i32> [#uses=0]
>         ret i32 0
> }
> 
> After running:
> %
> mother father
> 
> It's ok, but in prev. example (when I call strcat more than one times) 
> program works incorrectly
> help me please...
> 
> Best regards,
>    Zalunin Pavel
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> 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