On Fri, Jan 2, 2015 at 2:20 AM, David Majnemer <david.majnemer at gmail.com> wrote:> > > On Fri, Jan 2, 2015 at 1:58 AM, Vadim Chugunov <vadimcn at gmail.com> wrote: > >> Hi! >> LLVM has a class, ConstantExpr, that is very handy for compile-time >> evaluation of const expressions. Unfortunately I cannot find any methods >> in it that would be helpful in evaluation of expressions similar to this: >> (uintptr_t)(&(*(TYPE*)0).FIELD), which is basically the implementation of >> the offsetof(TYPE, FIELD) macro. >> > > I think the closest entity for this sort of thing is LLVM's > ConstantExpr::getOffsetOf. >Certainly, but I think this requires either making `offsetof` a first-class operation in the source language, or handling the folding of <pointer deref>-<field select>-<get-address-of> combo in the front-end.> Specifically, there seem to be no provisions for dereferencing a pointer. >> >> Does LLVM have any facilities (that I missed), that would help language >> front-ends in dealing with this sort of expressions? >> Obviously, clang does it somehow, but so far I was not able to locate the >> relevant bit of code. Any pointers would be appreciated! >> > > Clang handles record types in a very abstract way, it doesn't rely on LLVM > IR at any level. An ASTRecordLayout is built for a record type and the > ASTRecordLayout::getFieldIndex method is used to determine the offset for a > particular field. >So it handles all const expression evaluation in the front-end? -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150102/7f2d6688/attachment.html>
On Fri, Jan 2, 2015 at 2:53 AM, Vadim Chugunov <vadimcn at gmail.com> wrote:> > > On Fri, Jan 2, 2015 at 2:20 AM, David Majnemer <david.majnemer at gmail.com> > wrote: > >> >> >> On Fri, Jan 2, 2015 at 1:58 AM, Vadim Chugunov <vadimcn at gmail.com> wrote: >> >>> Hi! >>> LLVM has a class, ConstantExpr, that is very handy for compile-time >>> evaluation of const expressions. Unfortunately I cannot find any methods >>> in it that would be helpful in evaluation of expressions similar to this: >>> (uintptr_t)(&(*(TYPE*)0).FIELD), which is basically the implementation of >>> the offsetof(TYPE, FIELD) macro. >>> >> >> I think the closest entity for this sort of thing is LLVM's >> ConstantExpr::getOffsetOf. >> > > Certainly, but I think this requires either making `offsetof` a > first-class operation in the source language, or handling the folding of <pointer > deref>-<field select>-<get-address-of> combo in the front-end. > > >> Specifically, there seem to be no provisions for dereferencing a pointer. >>> >>> Does LLVM have any facilities (that I missed), that would help language >>> front-ends in dealing with this sort of expressions? >>> Obviously, clang does it somehow, but so far I was not able to locate >>> the relevant bit of code. Any pointers would be appreciated! >>> >> >> Clang handles record types in a very abstract way, it doesn't rely on >> LLVM IR at any level. An ASTRecordLayout is built for a record type and the >> ASTRecordLayout::getFieldIndex method is used to determine the offset for a >> particular field. >> > > So it handles all const expression evaluation in the front-end? > >Yes, clang has it's own constant expression evaluator which understands the rules of C++. Let's take an example. The expression (long)&x/(long)&y divides two globals by each other. This expression is lowered to the following LLVM IR Constant: i64 sdiv (i64 ptrtoint (i32* @x to i64), i64 ptrtoint (i32* @y to i64)) This Constant is a ConstantExpr but certainly not indicative of something that would be 'constexpr' in C++. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150102/7ea2a287/attachment.html>
> >> So it handles all const expression evaluation in the front-end? >> >> > Yes, clang has it's own constant expression evaluator which understands > the rules of C++. > > Let's take an example. > The expression (long)&x/(long)&y divides two globals by each other. This > expression is lowered to the following LLVM IR Constant: > i64 sdiv (i64 ptrtoint (i32* @x to i64), i64 ptrtoint (i32* @y to i64)) > > This Constant is a ConstantExpr but certainly not indicative of something > that would be 'constexpr' in C++. >My goal is to be able to use the result in constexpr contexts (like declaring an array, whose size expression involves offsetof()). Please correct me if this is wrong, but I think this means that the expression must be evaluated before any IR is emitted. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150102/2549b787/attachment.html>