[LLVMdev] src to src conversion
John Criswell
criswell at cs.uiuc.edu
Tue Apr 25 06:56:06 PDT 2006
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.
--
John T. Criswell
Research Programmer
University of Illinois at Urbana-Champaign
"It's today!" said Piglet. "My favorite day," said Pooh.
More information about the llvm-dev
mailing list