As a followup to my update to the inline asm docs, I'm cleaning up the
docs for 'Asm Labels.' The changes I want to make are pretty
straight-forward (attached; comments welcome). But then I came across
this line of code (from
https://github.com/rschmukler/cs537-p5/blob/master/xv6/proc.h#L38):
extern struct proc *proc asm("%gs:4");
This x86 code says that 'proc' is located at an offset of 4 bytes from
the gs register.
There isn't any description of using asm like this in the current Asm
Labels docs. But 'gs:4' isn't really a label. There also isn't any
description of it in the Explicit Reg Vars section. But 'gs:4' isn't
really a register either. So apparently using asm like this this isn't
documented anywhere.
Which makes me wonder: Is this not doc'ed because using 'asm' like this
isn't supported? Or is there a supported feature here that needs to be
doc'ed?
dw
Index: extend.texi
===================================================================
--- extend.texi (revision 226751)
+++ extend.texi (working copy)
@@ -8367,8 +8367,14 @@
You can specify the name to be used in the assembler code for a C
function or variable by writing the @code{asm} (or @code{__asm__})
-keyword after the declarator as follows:
+keyword after the declarator.
+It is up to you to make sure that the assembler names you choose do not
+conflict with any other assembler symbols.
+@subsubheading Assembler names for data:
+
+This sample shows how to specify the assembler name for data:
+
@smallexample
int foo asm ("myfoo") = 2;
@end smallexample
@@ -8379,33 +8385,30 @@
@samp{_foo}.
On systems where an underscore is normally prepended to the name of a C
-function or variable, this feature allows you to define names for the
+variable, this feature allows you to define names for the
linker that do not start with an underscore.
It does not make sense to use this feature with a non-static local
variable since such variables do not have assembler names. If you are
trying to put the variable in a particular register, see @ref{Explicit
-Reg Vars}. GCC presently accepts such code with a warning, but will
-probably be changed to issue an error, rather than a warning, in the
-future.
+Reg Vars}.
-You cannot use @code{asm} in this way in a function @emph{definition}; but
-you can get the same effect by writing a declaration for the function
-before its definition and putting @code{asm} there, like this:
+@subsubheading Assembler names for functions:
+To specify the assember name for functions, write a declaration for the
+function before its definition and put @code{asm} there, like this:
+
@smallexample
-extern func () asm ("FUNC");
-
-func (x, y)
- int x, y;
-/* @r{@dots{}} */
+extern int func (int x, int y) asm ("MYFUNC");
+
+int func (int x, int y)
+@{
+ /* @r{@dots{}} */
@end smallexample
-It is up to you to make sure that the assembler names you choose do not
-conflict with any other assembler symbols. Also, you must not use a
-register name; that would produce completely invalid assembler code. GCC
-does not as yet have the ability to store static variables in registers.
-Perhaps that will be added.
+@noindent
+This specifies that the name to be used for the function @code{func} in
+the assembler code should be @code{MYFUNC}.
@node Explicit Reg Vars
@subsection Variables in Specified Registers