From: SourceForge.net <no...@so...> - 2011-09-10 18:00:35
|
Bugs item #3407279, was opened at 2011-09-10 20:00 Message generated for change (Tracker Item Submitted) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&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 Preprocessor Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Maarten Brock (maartenbrock) Assigned to: Nobody/Anonymous (nobody) Summary: multiline macros with __asm become C multiple statements Initial Comment: When the preprcossor changes a multiline assembly macro into multiple __asm / __endasm blocks in order to preserve line endings it breaks up a single C statement into multiple C statements. This can break code if the statement is after a condition. E.g. #define NOPS \ __asm \ nop \ nop \ __endasm void test(void) { if (condition) NOPS; } This will be changed into void test(void) { if (condition) __asm nop __endasm; __asm nop __endasm; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&group_id=599 |
From: SourceForge.net <no...@so...> - 2011-09-11 07:34:43
|
Bugs item #3407279, was opened at 2011-09-10 20:00 Message generated for change (Comment added) made by borutr You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&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 Preprocessor Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Maarten Brock (maartenbrock) Assigned to: Nobody/Anonymous (nobody) Summary: multiline macros with __asm become C multiple statements Initial Comment: When the preprcossor changes a multiline assembly macro into multiple __asm / __endasm blocks in order to preserve line endings it breaks up a single C statement into multiple C statements. This can break code if the statement is after a condition. E.g. #define NOPS \ __asm \ nop \ nop \ __endasm void test(void) { if (condition) NOPS; } This will be changed into void test(void) { if (condition) __asm nop __endasm; __asm nop __endasm; } ---------------------------------------------------------------------- >Comment By: Borut Ražem (borutr) Date: 2011-09-11 09:34 Message: This problem raised with introduction of backslash replacement by "__endasm; __asm" in the macro definition, where a single C statement is automagically converted into multiple C statements by the preprocessor. The solution is: [code] #define NOPS \ do { __asm \ nop \ nop \ __endasm } while (0) [/code] See also bug #3407198. Borut ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&group_id=599 |
From: SourceForge.net <no...@so...> - 2011-09-11 07:41:33
|
Bugs item #3407279, was opened at 2011-09-10 20:00 Message generated for change (Comment added) made by borutr You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&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 Preprocessor Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Maarten Brock (maartenbrock) Assigned to: Nobody/Anonymous (nobody) Summary: multiline macros with __asm become C multiple statements Initial Comment: When the preprcossor changes a multiline assembly macro into multiple __asm / __endasm blocks in order to preserve line endings it breaks up a single C statement into multiple C statements. This can break code if the statement is after a condition. E.g. #define NOPS \ __asm \ nop \ nop \ __endasm void test(void) { if (condition) NOPS; } This will be changed into void test(void) { if (condition) __asm nop __endasm; __asm nop __endasm; } ---------------------------------------------------------------------- >Comment By: Borut Ražem (borutr) Date: 2011-09-11 09:41 Message: In my previous post the semicolon and backslash after __endasm are missing. The correct macro definition is: #define NOPS \ do { __asm \ nop \ nop \ __endasm; \ } while (0) or much better and cleaner: #define NOPS \ do { \ __asm nop __endasm; \ __asm nop __endasm; \ } while (0) ---------------------------------------------------------------------- Comment By: Borut Ražem (borutr) Date: 2011-09-11 09:34 Message: This problem raised with introduction of backslash replacement by "__endasm; __asm" in the macro definition, where a single C statement is automagically converted into multiple C statements by the preprocessor. The solution is: [code] #define NOPS \ do { __asm \ nop \ nop \ __endasm } while (0) [/code] See also bug #3407198. Borut ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&group_id=599 |
From: SourceForge.net <no...@so...> - 2011-09-14 17:38:20
|
Bugs item #3407279, was opened at 2011-09-10 20:00 Message generated for change (Comment added) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&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 Preprocessor >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Maarten Brock (maartenbrock) >Assigned to: Maarten Brock (maartenbrock) Summary: multiline macros with __asm become C multiple statements Initial Comment: When the preprcossor changes a multiline assembly macro into multiple __asm / __endasm blocks in order to preserve line endings it breaks up a single C statement into multiple C statements. This can break code if the statement is after a condition. E.g. #define NOPS \ __asm \ nop \ nop \ __endasm void test(void) { if (condition) NOPS; } This will be changed into void test(void) { if (condition) __asm nop __endasm; __asm nop __endasm; } ---------------------------------------------------------------------- >Comment By: Maarten Brock (maartenbrock) Date: 2011-09-14 19:38 Message: Fixed in SDCC 3.0.4 #6852 by inserting '‡' (0x87) instead of '__endasm; __asm' for line continuations inside __asm / __endasm blocks. ---------------------------------------------------------------------- Comment By: Borut Ražem (borutr) Date: 2011-09-11 09:41 Message: In my previous post the semicolon and backslash after __endasm are missing. The correct macro definition is: #define NOPS \ do { __asm \ nop \ nop \ __endasm; \ } while (0) or much better and cleaner: #define NOPS \ do { \ __asm nop __endasm; \ __asm nop __endasm; \ } while (0) ---------------------------------------------------------------------- Comment By: Borut Ražem (borutr) Date: 2011-09-11 09:34 Message: This problem raised with introduction of backslash replacement by "__endasm; __asm" in the macro definition, where a single C statement is automagically converted into multiple C statements by the preprocessor. The solution is: [code] #define NOPS \ do { __asm \ nop \ nop \ __endasm } while (0) [/code] See also bug #3407198. Borut ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3407279&group_id=599 |