[m-rev.] diff: fix library/exception.m and gcc 4 in .profdeep grades

Julien Fischer juliensf at csse.unimelb.edu.au
Tue Dec 26 17:41:03 AEDT 2006


Estimated hours taken: 1
Branches: main, release

Fix a bug that breaks compiling library/exception.m in deep profiling
grades with gcc 4.1.  This has been reported by several people on
Mercury users.

library/exception.m:
 	Make sure that the proc_layout structure for builtin_throw is
 	externally visible.  If we declare it to have static linkage then the
 	definition will conflict with the compiler generated declaration for
 	it.  Versions of gcc less than 4 didn't seem to care about this; with
 	gcc 4 and above it is reported as an error.  (Note: we have always
 	treated builtin_catch this way, the incorrect handling of
 	builtin_throw seems to have been an oversight.)

 	Add a couple of comments: a pointer from the proc_layout for
 	builtin_throw to comment above those for builtin_catch explaining
 	the reasons making these definitions external and a mention
 	of gcc 4 being a bit more picky about these matters.

Julien.

Index: exception.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/library/exception.m,v
retrieving revision 1.119
diff -u -r1.119 exception.m
--- exception.m	21 Dec 2006 03:00:48 -0000	1.119
+++ exception.m	26 Dec 2006 05:56:44 -0000
@@ -1842,8 +1842,12 @@
  ** (e.g. browser/declarative_debugger.m), and deep profiling may therefore
  ** need the address of the proc_layout structure for the call's
  ** call_site_static structure.
+**
+** Additionally, the compiler generated declaration for the proc_layout
+** structure will be declared extern if the address is required in other
+** modules.  GCC 4 and above consider a static definition and a non-static
+** declaration to be an error.
  */
-
  MR_EXTERN_USER_PROC_STATIC_PROC_LAYOUT(
      MR_DETISM_NON, MR_PROC_NO_SLOT_COUNT, -1,
      MR_PREDICATE, exception, builtin_catch, 3, 0);
@@ -1916,7 +1920,13 @@

  MR_proc_static_user_no_site(exception, builtin_throw, 1, 0,
      ""exception.m"", MR_DUMMY_LINE, MR_TRUE);
-MR_STATIC_USER_PROC_STATIC_PROC_LAYOUT(
+
+/*
+** See the above comments regarding builtin_catch for the reason we
+** must use MR_EXTERN_USER_PROC_STATIC_PROC_LAYOUT instead of 
+** MR_STATIC_USER_PROC_STATIC_PROC_LAYOUT here.
+*/
+MR_EXTERN_USER_PROC_STATIC_PROC_LAYOUT(
          MR_DETISM_DET, 1, MR_LONG_LVAL_STACKVAR_INT(1),
          MR_PREDICATE, exception, builtin_throw, 1, 0);
  MR_MAKE_USER_INTERNAL_LAYOUT(exception, builtin_throw, 1, 0, 1);

--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list