[LLVMdev] What happened to "malloc" in LLVM 3.0 IR?
Jacques Menu TvTMail
Jacques.Menu at tvtmail.ch
Thu Jan 19 21:49:48 PST 2012
Hello,
Thanks a lot for the fast and most useful answers, I can now fix this issue.
A nice day!
Regards,
Le 19 janv. 2012 à 17:25, Duncan Sands a écrit :
> Hi Jacques,
>
>> I have a compiler written with LLVM 2.6 by a student that produces .ll files, It behaved fine at the time.
>>
>> Trying to take the work over using version 3.0, I run into the problem that "malloc" in the IR is no longer valid:
>>
>> semac1 menu> llvm-as Carre.ll
>> llvm-as: Carre.ll:68:14: error: expected instruction opcode
>> %_malloc = malloc i8, i32 %2 ;<i8*> [#uses=1]
>> ^
>>
>> Couldn't find any hint on the web about how to modify the code generation in this compiler to go ahead.
>
> the malloc instruction was removed because it no longer offered any advantages
> over recognizing the standard library call "malloc". So the frontend should
> just be modified to generate a call to the "malloc" function.
> You can auto-upgrade any existing IR by using tools from 2.7, 2.8, ..., 3.0
> along the lines of:
> "opt-2.7 old_bitcode -o - | opt-2.8 -o - | opt-2.9 -o - | opt-3.0 -o new_bitcode"
> You can probably omit most of those versions if you are lucky.
>
> Ciao, Duncan.
>
>>
>> Thanks for your help!
>>
>> Regards,
>>
>> --
>>
>> Faulty line above is part of the following function:
>>
>> define i8* @lista_sprintf_double(double %number, i32 %taille, i32 %decimales) {
>> entry:
>> %_castInttoDbl = sitofp i32 %decimales to double ;<double> [#uses=1]
>> %0 = call i8* @lista_sprintf(i8* getelementptr inbounds ([5 x i8]* @_stringexpr1, i32 0, i32 0), double %_castInttoDbl) ;<i8*> [#uses=2]
>> %_castInttoDbl4 = sitofp i32 %taille to double ;<double> [#uses=1]
>> %1 = call i8* @lista_sprintf(i8* getelementptr inbounds ([5 x i8]* @_stringexpr3, i32 0, i32 0), double %_castInttoDbl4) ;<i8*> [#uses=2]
>> %_lenL = call i32 @strlen(i8* getelementptr inbounds ([2 x i8]* @_stringexpr4, i32 0, i32 0)) ;<i32> [#uses=1]
>> %_lenR = call i32 @strlen(i8* %1) ;<i32> [#uses=1]
>> %_totallen = add i32 %_lenL, 1 ;<i32> [#uses=1]
>> %2 = add i32 %_totallen, %_lenR ;<i32> [#uses=1]
>> %_malloc = malloc i8, i32 %2 ;<i8*> [#uses=1]
>> %_strcpy = call i8* @strcpy(i8* %_malloc, i8* getelementptr inbounds ([2 x i8]* @_stringexpr4, i32 0, i32 0)) ;<i8*> [#uses=1]
>> %_strcat = call i8* @strcat(i8* %_strcpy, i8* %1) ;<i8*> [#uses=2]
>> %_lenL5 = call i32 @strlen(i8* %_strcat) ;<i32> [#uses=1]
>> %_lenR6 = call i32 @strlen(i8* getelementptr inbounds ([2 x i8]* @_stringexpr2, i32 0, i32 0)) ;<i32> [#uses=1]
>> %_totallen7 = add i32 %_lenL5, 1 ;<i32> [#uses=1]
>> %3 = add i32 %_totallen7, %_lenR6 ;<i32> [#uses=1]
>> %_malloc8 = malloc i8, i32 %3 ;<i8*> [#uses=1]
>> %_strcpy9 = call i8* @strcpy(i8* %_malloc8, i8* %_strcat) ;<i8*> [#uses=1]
>> %_strcat10 = call i8* @strcat(i8* %_strcpy9, i8* getelementptr inbounds ([2 x i8]* @_stringexpr2, i32 0, i32 0)) ;<i8*> [#uses=2]
>> %_lenL11 = call i32 @strlen(i8* %_strcat10) ;<i32> [#uses=1]
>> %_lenR12 = call i32 @strlen(i8* %0) ;<i32> [#uses=1]
>> %_totallen13 = add i32 %_lenL11, 1 ;<i32> [#uses=1]
>> %4 = add i32 %_totallen13, %_lenR12 ;<i32> [#uses=1]
>> %_malloc14 = malloc i8, i32 %4 ;<i8*> [#uses=1]
>> %_strcpy15 = call i8* @strcpy(i8* %_malloc14, i8* %_strcat10) ;<i8*> [#uses=1]
>> %_strcat16 = call i8* @strcat(i8* %_strcpy15, i8* %0) ;<i8*> [#uses=2]
>> %_lenL17 = call i32 @strlen(i8* %_strcat16) ;<i32> [#uses=1]
>> %_lenR18 = call i32 @strlen(i8* getelementptr inbounds ([2 x i8]* @_stringexpr, i32 0, i32 0)) ;<i32> [#uses=1]
>> %_totallen19 = add i32 %_lenL17, 1 ;<i32> [#uses=1]
>> %5 = add i32 %_totallen19, %_lenR18 ;<i32> [#uses=1]
>> %_malloc20 = malloc i8, i32 %5 ;<i8*> [#uses=1]
>> %_strcpy21 = call i8* @strcpy(i8* %_malloc20, i8* %_strcat16) ;<i8*> [#uses=1]
>> %_strcat22 = call i8* @strcat(i8* %_strcpy21, i8* getelementptr inbounds ([2 x i8]* @_stringexpr, i32 0, i32 0)) ;<i8*> [#uses=1]
>> %6 = call i8* @lista_sprintf(i8* %_strcat22, double %number) ;<i8*> [#uses=1]
>> ret i8* %6
>> }
>>
>>
>> --
>>
>> Dr Jacques MENU
>> Chargé de cours
>> Centre Universitaire d'Informatique
>> Université de Genève
>> mailto://Jacques.Menu@unige.ch
>> http://cui.unige.ch/~menu
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> _______________________________________________
> 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