[LLVMdev] What happened to "malloc" in LLVM 3.0 IR?

John Criswell criswell at illinois.edu
Thu Jan 19 07:43:20 PST 2012


On 1/19/12 10:33 AM, Jacques Menu TvTMail wrote:
> Hello folks,
>
> 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.

Newer versions of LLVM do not have a malloc instruction.  Instead, the 
IR simply has calls to a function called malloc.  I think LLVM 2.6 has a 
pass that converts malloc instructions to call instructions that call 
the @malloc function; you could use that.

That said, I would not try to convert LLVM bitcode or assembly files 
from LLVM 2.6 to LLVM 3.0 format.  It would be better to update your 
LLVM tools to LLVM 3.0 and recompile the programs you compiled 
originally with LLVM 2.6.

-- John T.

>
> 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




More information about the llvm-dev mailing list