<div dir="ltr">Hi there,<div><br></div><div>I'm having a bit of a problem while trying to create BitCast instructions.</div><div>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:</div>

<div><br></div><div>void write(void* data, unsigned b); // write b bytes starting, at address "data", to an internal queue</div><div>void* read(unsigned b); // read and return b bytes from an internal queue<br clear="all">

<div><br></div><div>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</div>

<div><br></div><div>// Let Func be an llvm::Function* that represents read, CArgs contain an integer constant, and </div><div>// typeInFrontOfTheStream be an llvm::Type* that represents the type of the variable</div><div>

// available as the next read from the stream</div><div>







<p class=""><span class="">llvm</span>::<span class="">CallInst</span> *consume = <span class="">llvm</span>::<span class="">CallInst</span>::<span class="">Create</span>(Func, CArgs);</p></div><div>







<p class="">llvm<span class="">::</span>BitCastInst<span class=""> *cbi = </span><span class="">new</span><span class=""> </span>llvm<span class="">::</span>BitCastInst<span class="">(consume, typeInFrontOfTheStream</span><span class="">-></span>getPointerTo<span class="">());</span></p>

</div><div><br></div><div>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 </div>

<div>







<p class="">Assertion failed: (castIsValid(getOpcode(), S, Ty) && "Illegal BitCast"), function BitCastInst, file /Developer/llvm/lib/IR/Instructions.cpp, line 2842.</p></div><div><br></div><div>Does anyone have any suggestion about what I'm doing wrong?</div>

<div><br></div><div>Thanks in advance,</div><div><br>--<br>Cristianno Martins<br>PhD Student of Computer Science<br>University of Campinas<br><a href="mailto:cmartins@ic.unicamp.br" target="_blank">cmartins@ic.unicamp.br</a><br>

<a href="mailto:cristiannomartins@hotmail.com" target="_blank"></a></div>
</div></div>