[LLVMdev] src to src conversion
Ryan M. Lefever
lefever at crhc.uiuc.edu
Tue Apr 25 16:57:34 PDT 2006
This seems to work. Thank you for the help!
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.
>
>
>>
>> Thanks in advance for any help.
>>
>> Regards,
>> Ryan
>>
>
> -- John T.
>
--
Ryan M. Lefever [217.333.7231] [http://www.ews.uiuc.edu/~lefever]
More information about the llvm-dev
mailing list