aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>1999-07-30 18:26:09 -0700
committerRichard Henderson <rth@gcc.gnu.org>1999-07-30 18:26:09 -0700
commit47620e09d1e7f800ad5e8e3f2d92c22c2368e1c7 (patch)
tree4fcb7e7e333d3b398bc358961c028e0871d051a4
parentaac3691da5498ee2f93bae1866234ccdb9a956bd (diff)
downloadgcc-47620e09d1e7f800ad5e8e3f2d92c22c2368e1c7.zip
gcc-47620e09d1e7f800ad5e8e3f2d92c22c2368e1c7.tar.gz
gcc-47620e09d1e7f800ad5e8e3f2d92c22c2368e1c7.tar.bz2
Update for label differences.
From-SVN: r28351
-rw-r--r--gcc/extend.texi16
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/extend.texi b/gcc/extend.texi
index f969f65..89a79f5 100644
--- a/gcc/extend.texi
+++ b/gcc/extend.texi
@@ -295,11 +295,23 @@ Another use of label values is in an interpreter for threaded code.
The labels within the interpreter function can be stored in the
threaded code for super-fast dispatching.
-You can use this mechanism to jump to code in a different function. If
-you do that, totally unpredictable things will happen. The best way to
+You may not use this mechanism to jump to code in a different function.
+If you do that, totally unpredictable things will happen. The best way to
avoid this is to store the label address only in automatic variables and
never pass it as an argument.
+An alternate way to write the above example is
+
+@example
+static const int array[] = @{ &&foo - &&foo, &&bar - &&foo, &&hack - &&foo @};
+goto *(&&foo + array[i]);
+@end example
+
+@noindent
+This is more friendly to code living in shared libraries, as it reduces
+the number of dynamic relocations that are needed, and by consequence,
+allows the data to be read-only.
+
@node Nested Functions
@section Nested Functions
@cindex nested functions