hm.... I think, that is valid in c<br><br>but next code too doesn't works right:<br>; ModuleID = 'sample.lz'<br>@.str1 = internal global [6 x i8] c"world\00" ; <[6 x i8]*> [#uses=1]<br>
@.str2 = internal global [7 x i8] c"hello \00" ; <[7 x i8]*> [#uses=1]<br>@.str7 = internal global [7 x i8] c"father\00" ; <[7 x i8]*> [#uses=1]<br>@.str8 = internal global [8 x i8] c"mother \00" ; <[8 x i8]*> [#uses=1]
<br><br>declare i32 @puts(i8*)<br><br>declare i8* @strcat(i8*, i8*)<br><br>declare i32 @strlen(i8*)<br><br>declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)<br><br>define i32 @main() {<br>mainBlock:<br> %str3 = getelementptr [7 x i8]* @.str2, i64 0, i64 0 ; <i8*> [#uses=2]
<br> %str4 = getelementptr [6 x i8]* @.str1, i64 0, i64 0 ; <i8*> [#uses=1]<br> call i8* @strcat( i8* %str3, i8* %str4 ) ; <i8*>:0 [#uses=0]<br> %tmp6 = call i32 @puts( i8* %str3 ) ; <i32> [#uses=0]
<br> %str9 = getelementptr [8 x i8]* @.str8, i64 0, i64 0 ; <i8*> [#uses=2]<br> %str10 = getelementptr [7 x i8]* @.str7, i64 0, i64 0 ; <i8*> [#uses=1]<br> call i8* @strcat( i8* %str9, i8* %str10 ) ; <i8*>:1 [#uses=0]
<br> %tmp12 = call i32 @puts( i8* %str9 ) ; <i32> [#uses=0]<br> ret i32 0<br>}<br><br><br>writes:<br>%<br>hello world<br>mother orld<br><br><br>I tried decompile code:<br> main(int argc, char **argv) {
<br> char str1[] = "mother ";<br> strcat(str1, "father");<br> return 0;<br>}<br><br>decompiler gives to me code, in this code string " mother\0" presents as:<br><pre>%str1 = <span class="llvm_keyword">
alloca</span> [8 x <span class="llvm_type">i8</span>], align 16 ; <[8 x <span class="llvm_type">i8</span>]*> [#uses=9]<br> %tmp1 = <span class="llvm_keyword">getelementptr</span> [8 x <span class="llvm_type">i8</span>
]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">i32</span> 0 ; <<span class="llvm_type">i8</span>*> [#uses=2]<br> <span class="llvm_keyword">store</span> <span class="llvm_type">i8</span> 109,
<span class="llvm_type">i8</span>* %tmp1, align 16<br> %tmp4 = <span class="llvm_keyword">getelementptr</span> [8 x <span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">
i32</span> 1 ; <<span class="llvm_type">i8</span>*> [#uses=1]<br> <span class="llvm_keyword">store</span> <span class="llvm_type">i8</span> 111, <span class="llvm_type">i8</span>* %tmp4, align 1<br> %tmp7 = <span class="llvm_keyword">
getelementptr</span> [8 x <span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">i32</span> 2 ; <<span class="llvm_type">i8</span>*> [#uses=1]<br> <span class="llvm_keyword">
store</span> <span class="llvm_type">i8</span> 116, <span class="llvm_type">i8</span>* %tmp7, align 1<br> %tmp10 = <span class="llvm_keyword">getelementptr</span> [8 x <span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">
i32</span> 0, <span class="llvm_type">i32</span> 3 ; <<span class="llvm_type">i8</span>*> [#uses=1]<br> <span class="llvm_keyword">store</span> <span class="llvm_type">i8</span> 104, <span class="llvm_type">i8</span>
* %tmp10, align 1<br> %tmp13 = <span class="llvm_keyword">getelementptr</span> [8 x <span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">i32</span> 4 ; <<span class="llvm_type">
i8</span>*> [#uses=1]<br> <span class="llvm_keyword">store</span> <span class="llvm_type">i8</span> 101, <span class="llvm_type">i8</span>* %tmp13, align 1<br> %tmp16 = <span class="llvm_keyword">getelementptr</span> [8 x
<span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">i32</span> 5 ; <<span class="llvm_type">i8</span>*> [#uses=1]<br> <span class="llvm_keyword">store</span> <span class="llvm_type">
i8</span> 114, <span class="llvm_type">i8</span>* %tmp16, align 1<br> %tmp19 = <span class="llvm_keyword">getelementptr</span> [8 x <span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">
i32</span> 6 ; <<span class="llvm_type">i8</span>*> [#uses=1]<br> <span class="llvm_keyword">store</span> <span class="llvm_type">i8</span> 32, <span class="llvm_type">i8</span>* %tmp19, align 1<br> %tmp22 = <span class="llvm_keyword">
getelementptr</span> [8 x <span class="llvm_type">i8</span>]* %str1, <span class="llvm_type">i32</span> 0, <span class="llvm_type">i32</span> 7 ; <<span class="llvm_type">i8</span>*> [#uses=1]<br><br> <span class="llvm_keyword">
store</span> <span class="llvm_type">i8</span> 0, <span class="llvm_type">i8</span>* %tmp22, align 1</pre><br>it's looks funny, can you say another less complex way to do this operation?<br>Thanks<br><br>Best regards,
<br> Zalunin Pavel<br>