From: SourceForge.net <no...@so...> - 2008-04-02 18:20:58
|
Bugs item #1932509, was opened at 2008-04-02 20:20 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1932509&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Robert Larice (rlar) Assigned to: Nobody/Anonymous (nobody) Summary: broken offsetof() handling in SDCCast.c Initial Comment: struct st { char a; }; char * buggy(){ return &(((struct st code *) 0x1234) -> a); } returns an incorrect generic pointer at least for mcs51 target. the problem is caused by a special handling of cast's resembling the above one, in file SDCCast.c:3961 this special handling was built-in to process the the following macro (comment from SDCCast.c) /* handle offsetof macro: */ /* #define offsetof(TYPE, MEMBER) \ */ /* ((unsigned) &((TYPE *)0)->MEMBER) */ which in my opinion is naive anyway. offsets are better calculated by substraction of pointers, something very remotly like: #define offsetof(TYPE, MEMBER) \ (((int) &((TYPE*)0)->MEMBER) - (int) &(TYPE*)0) i've attached a testcase for support/regression... (tested only for mcs51-small) the testcase successfully destinguishes sdcc from a modified sdcc with disabled SDCCast.c:3961 Robert Larice ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1932509&group_id=599 |
From: SourceForge.net <no...@so...> - 2008-04-03 13:05:30
|
Bugs item #1932509, was opened at 2008-04-02 20:20 Message generated for change (Comment added) made by patryks You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1932509&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Robert Larice (rlar) Assigned to: Nobody/Anonymous (nobody) Summary: broken offsetof() handling in SDCCast.c Initial Comment: struct st { char a; }; char * buggy(){ return &(((struct st code *) 0x1234) -> a); } returns an incorrect generic pointer at least for mcs51 target. the problem is caused by a special handling of cast's resembling the above one, in file SDCCast.c:3961 this special handling was built-in to process the the following macro (comment from SDCCast.c) /* handle offsetof macro: */ /* #define offsetof(TYPE, MEMBER) \ */ /* ((unsigned) &((TYPE *)0)->MEMBER) */ which in my opinion is naive anyway. offsets are better calculated by substraction of pointers, something very remotly like: #define offsetof(TYPE, MEMBER) \ (((int) &((TYPE*)0)->MEMBER) - (int) &(TYPE*)0) i've attached a testcase for support/regression... (tested only for mcs51-small) the testcase successfully destinguishes sdcc from a modified sdcc with disabled SDCCast.c:3961 Robert Larice ---------------------------------------------------------------------- Comment By: Patryk (patryks) Date: 2008-04-03 15:05 Message: Logged In: YES user_id=1788180 Originator: NO Obviously SDCC got problems with such casts: [ 1928022 ] ROM pointer to struct member not initialized [ 1921073 ] Bad code when casting from code to generic ptr in 2.8.0 RC1 (surfaced and killed just before 2.8.0 release) [ 1839277 ] Implicit typecast from code to generic pointer is wrong etc. BTW: offsetof(type, member) macro is defined like ((size_t) &(((type *) 0)->member)) in every of 4 compilers (embedded and desktop) I'm currently using. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1932509&group_id=599 |
From: SourceForge.net <no...@so...> - 2010-08-05 13:53:41
|
Bugs item #1932509, was opened at 2008-04-02 20:20 Message generated for change (Comment added) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1932509&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Robert Larice (rlar) >Assigned to: Maarten Brock (maartenbrock) Summary: broken offsetof() handling in SDCCast.c Initial Comment: struct st { char a; }; char * buggy(){ return &(((struct st code *) 0x1234) -> a); } returns an incorrect generic pointer at least for mcs51 target. the problem is caused by a special handling of cast's resembling the above one, in file SDCCast.c:3961 this special handling was built-in to process the the following macro (comment from SDCCast.c) /* handle offsetof macro: */ /* #define offsetof(TYPE, MEMBER) \ */ /* ((unsigned) &((TYPE *)0)->MEMBER) */ which in my opinion is naive anyway. offsets are better calculated by substraction of pointers, something very remotly like: #define offsetof(TYPE, MEMBER) \ (((int) &((TYPE*)0)->MEMBER) - (int) &(TYPE*)0) i've attached a testcase for support/regression... (tested only for mcs51-small) the testcase successfully destinguishes sdcc from a modified sdcc with disabled SDCCast.c:3961 Robert Larice ---------------------------------------------------------------------- >Comment By: Maarten Brock (maartenbrock) Date: 2010-08-05 15:53 Message: This appears to have been fixed before SDCC 2.9.7 #5915. ---------------------------------------------------------------------- Comment By: Patryk (patryks) Date: 2008-04-03 15:05 Message: Logged In: YES user_id=1788180 Originator: NO Obviously SDCC got problems with such casts: [ 1928022 ] ROM pointer to struct member not initialized [ 1921073 ] Bad code when casting from code to generic ptr in 2.8.0 RC1 (surfaced and killed just before 2.8.0 release) [ 1839277 ] Implicit typecast from code to generic pointer is wrong etc. BTW: offsetof(type, member) macro is defined like ((size_t) &(((type *) 0)->member)) in every of 4 compilers (embedded and desktop) I'm currently using. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1932509&group_id=599 |
From: Robert L. <la...@vi...> - 2008-04-06 17:31:48
|
I've experimented with a modification of sdcc, which implements the offsetof() macro with a builtin function. Note, the newer gcc uses such a __builtin_offsetof as well to implement the somewhat tricke offsetof, which was my motivation to try this for sdcc as well. This would allow to remove the special offsetof hack in SDCCast.c, and ease some bug fixing, for example #1932509 the experimental patch consists of extension of SDCC.lex for the new keyword __builtin_offsetof extension of SDCC.y for parsing of this keyword (comparable to SIZEOF) extension of SDCCast.c for recursive walk of the type/element tuple parameters of __builtin_offsetof, to replace the OFFSETOF ast with a suitable newAst_VALUE a new support/regression/tests file, to verfiy the implementation. I'd ask for comments/statements whether this would be considered useful first, ere I clean up my somewhat polluted source-tree. Robert Larice |