With Clang, it's reasonably straightforward to compile a C/C++ file to bitcode. Is there a way to compile a program together with all the standard library functions it uses, to that format? That is, suppose you have hello.c that calls printf, how would you go about generating the bitcode representation of both the main function from hello.c, and printf itself (plus whatever other standard library functions printf calls)? Or put another way, given that one answer to the above question would be 'download the source of GNU libc, manually run Clang to compile the whole lot to bitcode, then manually extract the bitcode versions of the functions you are interested in,' is there a more automated way to do it (in the sense that a linker provides a more automated way to do a similar job of building an executable)?
On 6/3/11 10:12 PM, Russell Wallace wrote:> With Clang, it's reasonably straightforward to compile a C/C++ file to bitcode. > > Is there a way to compile a program together with all the standard > library functions it uses, to that format? That is, suppose you have > hello.c that calls printf, how would you go about generating the > bitcode representation of both the main function from hello.c, and > printf itself (plus whatever other standard library functions printf > calls)? > > Or put another way, given that one answer to the above question would > be 'download the source of GNU libc, manually run Clang to compile the > whole lot to bitcode, then manually extract the bitcode versions of > the functions you are interested in,' is there a more automated way > to do it (in the sense that a linker provides a more automated way to > do a similar job of building an executable)?You can link your bitcode together with glibc's bitcode by using the llvm-link utility. Then you can run DCE over the bitcode with "opt -dce" and cull all the functions you don't need. But why are you trying to do this at all? Chip
On Sat, Jun 4, 2011 at 5:21 AM, Charles Davis <cdavis at mymail.mines.edu> wrote:> You can link your bitcode together with glibc's bitcode by using the > llvm-link utility. Then you can run DCE over the bitcode with "opt -dce" > and cull all the functions you don't need.Right, that's still a reasonably straightforward solution for C... I think what I'm more concerned about is C++, where templates break the simple model of source to object to linking. Trying to wrap my head around what the pipeline would look like in the C++ case.> But why are you trying to do this at all?I've got some ideas for automatic detection of bugs in C/C++ code, looking into the feasibility of using Clang as a front-end in the hope of only having to write a parser for the ASCII version of bitcode (dead easy) instead of C (somewhat easy) and C++ (hard).