Summary: | Variable called $1 causes invalid asm to be generated | ||
---|---|---|---|
Product: | gcc | Reporter: | Lukas Mai <rwxr-xr-x> |
Component: | target | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED DUPLICATE | ||
Severity: | minor | CC: | cw, fw, jsm28 |
Priority: | P3 | Keywords: | assemble-failure |
Version: | 4.6.3 | ||
Target Milestone: | --- | ||
See Also: | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46163 | ||
Host: | Target: | i686-pc-linux-gnu | |
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: |
Description
Lukas Mai
2012-03-10 21:28:49 UTC
C does not allow an identifier to start with a dollar. But we even accept the program with -std=c99 -pedantic-errors. 6.4.2.1 says that an identifier may contain "other implementation-defined characters". It gets better: int $42 = 0; int main(void) { return $42; } % gcc try.c; ./a.out; echo $? 42 % gcc -O2 try.c; ./a.out; echo $? 42 % gcc -flto try.c; ./a.out; echo $? /tmp/cc5Gwdzb.s: Assembler messages: /tmp/cc5Gwdzb.s:13: Error: junk `.1988' after expression lto-wrapper: gcc returned 1 exit status /usr/bin/ld: lto-wrapper failed collect2: ld returned 1 exit status zsh: no such file or directory: ./a.out 127 % gcc -O -flto try.c; ./a.out; echo $? 0 So compiling this program either 1) generates bogus code, 2) causes assembler syntax errors, or 3) compiles correctly, depending on which compiler flags are used. Some platforms (such as VMS) support $ in identifiers, similar to _. It seems that your assembler doesn't: http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html (If you compile with -pedantic, you'll get a warning.) This is not much different from platforms where global symbols are case-insensitive or severely limited in length. Hi, I tested the 42 it mit older gcc, and it behaved better: gcc --version gcc (GCC) 4.2.4 (Gentoo 4.2.4 p1.0) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. cat >try.c int $42 = 0; int main(void) { return $42; } gcc try.c; ./a.out; echo $? /tmp/ccY61UFa.s: Assembler messages: /tmp/ccY61UFa.s:18: Error: junk `(%rip)' after expression bash: ./a.out: No such file or directory 127 gcc -O2 try.c; ./a.out; echo $? /tmp/ccXk0zWe.s: Assembler messages: /tmp/ccXk0zWe.s:8: Error: junk `(%rip)' after expression bash: ./a.out: No such file or directory 127 But I would expect an syntax error thrown by gcc here. From the gcc documentation: | However, dollar signs in identifiers are not supported on a few target | machines, typically because the target assembler does not allow them. That's nice, but: | * If the compiler produces invalid assembly code, for any input | whatever (except an `asm' statement), that is a compiler bug, | unless the compiler reports errors (not just warnings) which would | ordinarily prevent the assembler from being run. | * If the compiler produces valid assembly code that does not | correctly execute the input source code, that is a compiler bug. If my target assembler (gas) doesn't allow them, you must produce an error. Making up asm syntax and handing it to the assembler is not an option. Alternatively, change the documentation to the effect that invalid assembly code and valid (but semantically wrong) assembly code aren't necessarily compiler bugs. "Alternatively, change the documentation to the effect that invalid assembly code and valid (but semantically wrong) assembly code aren't necessarily compiler bugs." Its a "windows-approach" Not a bug but a feature. Intel calls their errata sheets for silicon bugs "specification update" That's really sweet, so whats a spec for? Please fix it in gcc to be a syntax error, or at least throw a warning like "Illegal variable name found in line # might cause illegal assembly code and thus unpredictable results!". This would be the best, so if one has a special "geeks-assembler", that allows a $ to be send to the assembler, so one could use it, for what special geeks-reason ever (may be, to have a hack to illegally allign a variable in memory between the rails of the processors word length in order to smear it into two registers [highbyte of lower register and lowbyte of upper register] of some IO or to do some other dirty stuff directly from hell) According to the documentation this is a valid bug. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52554#c6. |