Anton Skvorts
2011-Feb-13 16:35 UTC
[LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
Oh, I thought that after "codegening" cos(0) would get me double 1.0 (assigment is working for anything like: global a = 1/3 + 2 /3 for example) What would be the best way to make assigments involving functions, like global a = cos(0); without getting the assertion arising from InitVal cast<Constant>(Init->Codegen()); ? I made some changes and now my code basically works, except in assigments like the one above. It is a little bit frustrating because is the main thing preventing me finishing my little silly scripting language for monte carlo simulations. Value *GlobalExprAST::Codegen() { for (unsigned i = 0, e = GlobalNames.size(); i != e; ++i) { const std::string &GlobalName = GlobalNames[i].first; ExprAST *Init = GlobalNames[i].second; Constant *InitVal; InitVal = cast<Constant>(Init->Codegen()); if (InitVal == 0) return 0; GlobalVariable * globval = new GlobalVariable(*TheModule, InitVal->getType(), false, llvm::GlobalValue::ExternalLinkage, InitVal, Twine(GlobalName) ); } } Thank you very much for our help Anton 2011/2/13 Duncan Sands <baldrick at free.fr>:> Hi Anton, > >> But there are still some details I must be missing. I'm getting an assertion >> when I try the following assignment in my script: >> global c = cos(1); >> Assertion failed: isa<X>(Val) && "cast<Ty>() argument of incompatible type!", > > I think this is telling you that cos(1) is not a constant. > > Ciao, Duncan. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
Reid Kleckner
2011-Feb-13 16:55 UTC
[LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
On Sun, Feb 13, 2011 at 11:35 AM, Anton Skvorts <anton.skvorts at gmail.com> wrote:> Oh, I thought that after "codegening" cos(0) would get me double 1.0Your codegen method looks like it will generate code to evaluate cos(0). There's no way in LLVM to run this code at global scope, it has to be inside a function. If you want to support running arbitrary code at global scope in your language, you probably want to do something like what C++ does for static initializers, where you run code before main and fill in the values of global variables.> (assigment is working for anything like: global a = 1/3 + 2 /3 for > example)The reason 1/3 + 2/3 works is because the IRBuilder recognizes these as constants for you and folds them down to an LLVM Constant. Reid
Duncan Sands
2011-Feb-13 17:09 UTC
[LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
Hi Anton,> Oh, I thought that after "codegening" cos(0) would get me double 1.0 > (assigment is working for anything like: global a = 1/3 + 2 /3 for > example) What would be the best way to make assigments involving > functions, like global a = cos(0); > without getting the assertion arising from InitVal > cast<Constant>(Init->Codegen()); ?the problem is that you are performing a function call (to "cos"). A function call is simply not a constant in the sense of LLVM (even if it is a constant in the sense of mathematics): it needs to be executed to work out what the return value is, and something that needs to be executed is not a Constant. Probably you should have a constructor call "cos" and assign the return value to your global. To work out how to do this I suggest you write the C code corresponding to assigning cos(0) to a and stick it in http://llvm.org/demo to see how it is handled. Ciao, Duncan.
António Saragga Seabra
2011-Feb-13 19:45 UTC
[LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
Hi Duncan and Reid, Thanks for your comments and suggestions. I was puzzled because assigning to a local variable in the tutorial example works. For example: var a = cos(1) in ( 2 * a ); emits declare double @cos(double) define double @0() { entry: ret double 0x3FF14A280FB5068C } and we get the right answer 1.08060461. On Sun, Feb 13, 2011 at 5:09 PM, Duncan Sands <baldrick at free.fr> wrote:> > Hi Anton, > > > Oh, I thought that after "codegening" cos(0) would get me double 1.0 > > (assigment is working for anything like: global a = 1/3 + 2 /3 for > > example) What would be the best way to make assigments involving > > functions, like global a = cos(0); > > without getting the assertion arising from InitVal > > cast<Constant>(Init->Codegen()); ? > > the problem is that you are performing a function call (to "cos"). A function > call is simply not a constant in the sense of LLVM (even if it is a constant in > the sense of mathematics): it needs to be executed to work out what the return > value is, and something that needs to be executed is not a Constant. > > Probably you should have a constructor call "cos" and assign the return value > to your global. To work out how to do this I suggest you write the C code > corresponding to assigning cos(0) to a and stick it in http://llvm.org/demo to > see how it is handled. > > Ciao, Duncan. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reasonably Related Threads
- [LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
- [LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
- [LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
- [LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'
- [LLVMdev] conversion from 'const llvm::Value*' to 'llvm::Constant*'