George Burgess IV via llvm-dev
2016-Feb-09 19:32 UTC
[llvm-dev] Question about __builtin_object_size
Hi! This is an artifact of how LLVM works. Essentially, LLVM detects that `var` is unused and deletes it before it tries to lower the `llvm.objectsize` (which is what clang lowers `__builtin_object_size` to) call to a constant. While this isn't ideal, I don't think it realistically a problem, because `var` must be otherwise unused for this behavior to occur, and the whole purpose of objectsize functions (so far) is to insert bounds checks when a variable is used. If this quirk is causing real problems for you, please let me know and I'll see what I can do about fixing it. :) Thanks for pointing this out! George On Tue, Feb 9, 2016 at 11:06 AM, Xinliang David Li <xinliangli at gmail.com> wrote:> What version of clang/LLVM are you using? George (cc'ed ) has improved > __builtin_object_size support in Clang recently. > > David > > On Tue, Feb 9, 2016 at 6:37 AM, Strahinja Petrovic via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> Hi, >> >> I have question about __builtin_object_size behaviour. LLVM for >> __builtin_object_size function doesn't calculate correct value when pointer >> is used only in __builtin_object_size function call, and never after that. >> For this case LLVM as result generates 0 or -1 depends of second argument >> of __builtin_object_size function. Is this correct behaviour or it should >> work as gcc (gcc calculates correct value for this case) ? >> >> Example for this issue: >> >> include <assert.h> >> int main() { >> struct V { char buf1[10]; >> int b; >> char buf2[10]; >> } var; >> >> char *p = &var.buf1[1], *q = &var.b; >> assert (__builtin_object_size (p, 0) == sizeof (var) - 1); >> return 0; >> } >> >> Thanks, >> Strahinja >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160209/08e47e6f/attachment.html>
Strahinja Petrovic via llvm-dev
2016-Feb-10 10:46 UTC
[llvm-dev] Question about __builtin_object_size
Thank you for replies. I'm using trunk version. I have problem in some tests with this behaviour. I also have fix for this problem just need an opinion if this should be fixed in clang. I can post patch on phabricator if you want to take a look. Thanks, Strahinja On 09.02.2016. 20:32, George Burgess IV wrote:> Hi! > > This is an artifact of how LLVM works. Essentially, LLVM detects that > `var` is unused and deletes it before it tries to lower the > `llvm.objectsize` (which is what clang lowers `__builtin_object_size` > to) call to a constant. While this isn't ideal, I don't think it > realistically a problem, because `var` must be otherwise unused for > this behavior to occur, and the whole purpose of objectsize functions > (so far) is to insert bounds checks when a variable is used. > > If this quirk is causing real problems for you, please let me know and > I'll see what I can do about fixing it. :) > > Thanks for pointing this out! > George > > On Tue, Feb 9, 2016 at 11:06 AM, Xinliang David Li > <xinliangli at gmail.com <mailto:xinliangli at gmail.com>> wrote: > > What version of clang/LLVM are you using? George (cc'ed ) has > improved __builtin_object_size support in Clang recently. > > David > > On Tue, Feb 9, 2016 at 6:37 AM, Strahinja Petrovic via llvm-dev > <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote: > > Hi, > > I have question about __builtin_object_size behaviour. LLVM > for __builtin_object_size function doesn't calculate correct > value when pointer is used only in __builtin_object_size > function call, and never after that. For this case LLVM as > result generates 0 or -1 depends of second argument of > __builtin_object_size function. Is this correct behaviour or > it should work as gcc (gcc calculates correct value for this > case) ? > > Example for this issue: > > include <assert.h> > int main() { > struct V { char buf1[10]; > int b; > char buf2[10]; > } var; > > char *p = &var.buf1[1], *q = &var.b; > assert (__builtin_object_size (p, 0) == sizeof (var) > - 1); > return 0; > } > > Thanks, > Strahinja > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160210/bc09d4bf/attachment.html>
Xinliang David Li via llvm-dev
2016-Feb-10 16:35 UTC
[llvm-dev] Question about __builtin_object_size
Patch is certainly welcome. David On Wed, Feb 10, 2016 at 2:46 AM, Strahinja Petrovic < strahinja.petrovic at rt-rk.com> wrote:> > Thank you for replies. I'm using trunk version. I have problem in some > tests with this behaviour. I also have fix for this problem just need an > opinion if this should be fixed in clang. I can post patch on phabricator > if you want to take a look. > > Thanks, > Strahinja > > > On 09.02.2016. 20:32, George Burgess IV wrote: > > Hi! > > This is an artifact of how LLVM works. Essentially, LLVM detects that > `var` is unused and deletes it before it tries to lower the > `llvm.objectsize` (which is what clang lowers `__builtin_object_size` to) > call to a constant. While this isn't ideal, I don't think it realistically > a problem, because `var` must be otherwise unused for this behavior to > occur, and the whole purpose of objectsize functions (so far) is to insert > bounds checks when a variable is used. > > If this quirk is causing real problems for you, please let me know and > I'll see what I can do about fixing it. :) > > Thanks for pointing this out! > George > > On Tue, Feb 9, 2016 at 11:06 AM, Xinliang David Li <xinliangli at gmail.com> > wrote: > >> What version of clang/LLVM are you using? George (cc'ed ) has improved >> __builtin_object_size support in Clang recently. >> >> David >> >> On Tue, Feb 9, 2016 at 6:37 AM, Strahinja Petrovic via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >>> Hi, >>> >>> I have question about __builtin_object_size behaviour. LLVM for >>> __builtin_object_size function doesn't calculate correct value when pointer >>> is used only in __builtin_object_size function call, and never after that. >>> For this case LLVM as result generates 0 or -1 depends of second argument >>> of __builtin_object_size function. Is this correct behaviour or it should >>> work as gcc (gcc calculates correct value for this case) ? >>> >>> Example for this issue: >>> >>> include <assert.h> >>> int main() { >>> struct V { char buf1[10]; >>> int b; >>> char buf2[10]; >>> } var; >>> >>> char *p = &var.buf1[1], *q = &var.b; >>> assert (__builtin_object_size (p, 0) == sizeof (var) - 1); >>> return 0; >>> } >>> >>> Thanks, >>> Strahinja >>> _______________________________________________ >>> LLVM Developers mailing list >>> llvm-dev at lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>> >> >> > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160210/262aca1b/attachment.html>