Hi there,
I'm having a bit of a problem while trying to create BitCast instructions.
Well, first, I have some very generic functions written in C, for which I
would like to make calls on another C file I'm playing with using an LLVM
Pass. The simplified signature of two of these functions can be seen below:
void write(void* data, unsigned b); // write b bytes starting, at address
"data", to an internal queue
void* read(unsigned b); // read and return b bytes from an internal queue
Since I would like to be able to use variables of any type as arguments for
these two functions, I thought I could create a BitCastInst, in order to
cast a pointer from any type to void*, and then back, and insert it before
calling write, or after calling read. And so I did like the example below
// Let Func be an llvm::Function* that represents read, CArgs contain an
integer constant, and
// typeInFrontOfTheStream be an llvm::Type* that represents the type of the
variable
// available as the next read from the stream
llvm::CallInst *consume = llvm::CallInst::Create(Func, CArgs);
llvm::BitCastInst *cbi = new llvm::BitCastInst(consume,
typeInFrontOfTheStream->getPointerTo());
For the first example when running this pass, the typeInFrontOfTheStream is
an i1, which means the result of typeInFrontOfTheStream->getPointerTo() is
an i1*. Remember that consume is a function that returns void*, which is
seen in LLVMIR as i8*. And, for a first execution like that, I'm getting
Assertion failed: (castIsValid(getOpcode(), S, Ty) && "Illegal
BitCast"),
function BitCastInst, file /Developer/llvm/lib/IR/Instructions.cpp, line
2842.
Does anyone have any suggestion about what I'm doing wrong?
Thanks in advance,
--
Cristianno Martins
PhD Student of Computer Science
University of Campinas
cmartins at ic.unicamp.br
<cristiannomartins at hotmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20131010/919992a4/attachment.html>