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
wrong?)
>
>> 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