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.