[LLVMdev] src to src conversion

Patrick Meredith pmeredit at uiuc.edu
Tue Apr 25 08:57:19 PDT 2006

On Apr 25, 2006, at 8:56 AM, John Criswell wrote:

> Ryan M. Lefever wrote:
>> I am trying to use LLVM as a source to source C compiler.  I use  
>> llvm-gcc to convert file.c->file.bc.  Then I use opt to run my own  
>> compiler passes to convert file.bc->file.opt.bc.  Then I use llc  
>> to convert file.opt.bc->file.opt.c.  Now, I want to use normal gcc  
>> to compile file.opt.c into an executable.  However, I'm getting  
>> the following errors:
> Please try the following:
> llvm-gcc -o final file.opt.bc -lcrtend
> llc -march=c final.bc
> gcc -o finalexec final.cbe.c
> The first line uses llvm-gcc to link libcrtend.a to your optimized  
> bytecode file.  Using llvm-gcc ensures that it picks up the version  
> of libcrtend.a located within your llvm-gcc distribution (which  
> should work).
> The second and third lines generate the C code and compile it into  
> a final executable.
> If that doesn't work, please let me know.
>> test.opt.c:89: warning: conflicting types for built-in function  
>> 'malloc'
>> test.opt.o(.text+0xe7): In function `main':
>> : undefined reference to `__main'
>> collect2: ld returned 1 exit status
>> make: *** [test.opt.exe] Error 1
>> ------
>> I think the problem with main and __main is that I need to link in  
>> some LLVM runtime libraries.  So, I tried to link in crtend (which  
>> defines __main).  However, I get the following error:
>> /home/testbed1/lefever/work/llvm/install/lib/libcrtend.a: could  
>> not read symbols: Archive has no index; run ranlib to add one
>> collect2: ld returned 1 exit status
>> make: *** [test.opt.exe] Error 1
>> I tried creating a copy of the libcrtend.a and running ranlib on  
>> it and I also separately tried running llvm-ranlib on it.  Neither  
>> of those actions worked though.  Am I linking the correct library,  
>> i.e., crtend?  Why am I getting the error about the archive having  
>> no index?
>> -----
>> As far as the warning about conflicting types for malloc, it  
>> appears that llvm is using the declaration where the output of  
>> malloc is a "signed char *" rather than "void *".  Why is that?
> My memory is foggy, but it's probably because either the LLVM  
> libraries (from llvm/runtime) or the LLVM code you're compiling has  
> a prototype for malloc that returns "signed char *," but the header  
> file being pulled in by GCC when compiling the .cbe.c file has a  
> prototype for "void *."  It's also possible that llc is adding the  
> malloc prototype as well.  If you're really curious, some simple  
> experimentation should indicate which of the above it is.

My guess is that it is because void* is always converted to sbyte* in  
llvm.  Since both char* and void* get mapped to sbyte*
the mapping back is difficult, and perhaps impossible.  (Maybe I'm  

>> Thanks in advance for any help.
>> Regards,
>> Ryan
> -- John T.
> -- 
> John T. Criswell
> Research Programmer
> University of Illinois at Urbana-Champaign
> "It's today!" said Piglet. "My favorite day," said Pooh.
> _______________________________________________
> 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