[LLVMdev] Instantiating modules from .bc files
Chris Lattner
sabre at nondot.org
Wed Dec 26 19:52:58 PST 2007
Take a look at the llvm2cpp tool. It converts a bc file into the c++
code to create it. This lets you compile and link the module into
your app. Alternatively, you can turn the bc file into a static array
in your app and read it with the bcreader.
-Chris
http://nondot.org/sabre
http://llvm.org
On Dec 26, 2007, at 6:01 PM, Danny <llvm at pixelperplexity.net> wrote:
> That worked quite well. Thank you. One question as a follow up: is
> there a nice/standard way of including the pre-made bitcode chunks
> in with the binaries that are being created which read them?
>
> Bascially, I'd like to have the same functionality, but rather than
> having one or more .bc files running around which need to be read at
> runtime by an executable, moving that into the code itself so it's
> all contained in one.
>
> Thanks,
> danny
>
> On Dec 26, 2007, at 3:33 PM, Gordon Henriksen wrote:
>
>> Hi Danny,
>>
>> On 2007-12-26, at 15:39, Danny wrote:
>>
>>> I've noticed that the BitcodeReader appears to be an internal
>>> module, but the BitstreamReader is public. Should I be using the
>>> BitstreamReader? If so how.
>>
>> The generic BitstreamReader class is public because it's used in
>> other projects, including clang, to serialize data structures other
>> than LLVM IR. The coding of the LLVM IR within the bitstream are
>> private to the reader and writer modules. The functions exposed in
>> ReaderWriter.h are the public interface to that functionality.
>>
>>> I tried to get a module out of a file that I'd read in to it using
>>> this code:
>>>
>>> MemoryBuffer* memBuf = MemoryBuffer::getFile(filename, sizeof
>>> filename, &errStr);
>>> printf("errStr: %s\n", errStr.c_str());
>>> BitcodeReader::BitcodeReader bcReader(memBuf);
>>> Module* Mod = bcReader.materializeModule(&errInfo);
>>> printf("errInfo: %s\n", errInfo.c_str());
>>>
>>> verifyModule(*Mod, PrintMessageAction);
>>>
>>> The errStr and the errInfo strings were empty, but I got a crash
>>> on the verifyModule call.
>>
>> Try this:
>>
>> #include "llvm/Bitcode/ReaderWriter.h"
>>
>> ...
>>
>> std::string &Message;
>> llvm::Module* Mod = llvm::ParseBitcodeFile(MemBuf, &Message);
>> if (!Mod) {
>> // Message contains an error message.
>> std::cerr << "error reading bitcode: " << Message << "\n";
>> exit(1); // Don't segfault!
>> }
>>
>> // Okay, Mod is valid.
>> ...
>>
>> delete Mod;
>>
>> Also note that the primary error indicator is not the string, but
>> the return pointer, so you should always check that (not the error
>> string) and stop if it's null in order to avoid segfaulting.
>>
>> — Gordon
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20071226/46048852/attachment.html>
More information about the llvm-dev
mailing list