[comp.lang.c++] C++ on Stellar GS/1000

leech@luther.cs.unc.edu (02/06/89)

    I just finished installing cfront 1.2.1 on a Stellar GS/1000.
Useful things which other porters may wish to know:

    - Stellix is System-V based (more or less), but doesn't have
	libld, so the munch option should be used.

    - when bootstrapping ('make fillscratch') on a machine already
	using C++, make sure to copy <datalock.h> along with <stdio.h>
	and <ctype.h> from the Stellar. When adding prototypes to
	<stdio.h>, include these:
	    int __putc(int, FILE *);
	    int __getc(FILE *);
	as well as the usual stdio prototypes.

    - the Stellar optimizer is untrustworthy and should be avoided.
	This is actually not a problem in installing C++, but might be
	with C++ code you attempt to port to the Stellar (or C code,
	for that matter).

    - The following changes to lib/static/munch.c (presented in 'diff -c'
	form) must be made to deal with Stellar's 'nm' output and
	mangling of function names:

*** munch.c	Sun Feb  5 17:08:46 1989
--- munch_att.c Sun Feb  5 17:08:49 1989
***************
*** 1,13 ****
  /* @(#) munch.c 1.7 2/16/87 11:03:03 */
  /*ident "@(#)cfront:lib/static/munch.c  1.7"*/
  /*
-	This version of munch.c is hacked for the Stellar GS/1000.
-	Stellar's 'nm' puts the symbol name first on each line,
-	and their object format creates two symbols for each procedure
-	entry point, e.g. "main_E" and "main_T".
-	    Jon Leech 2/6/89
-
	scan nm output and detect constructors and destructors for static objects.
	the name is expected to be on the form _STD*_ or _STI*_ and less than
	100 characters long.
	nm output lines are assumed to be less than 256 characters long.
--- 1,8 ----
  /* @(#) munch.c 1.7 2/16/87 11:03:03 */
  /*ident "@(#)cfront:lib/static/munch.c  1.7"*/
  /*
	scan nm output and detect constructors and destructors for static objects.
+	the name on an nm output line is expected to be in the right hand margin.
	the name is expected to be on the form _STD*_ or _STI*_ and less than
	100 characters long.
	nm output lines are assumed to be less than 256 characters long.
***************
*** 15,24 ****
	destructors found are called by exit().
	return 0 if no constructor or destructor is found otherwise.
	The output is redirected by CC into _ctdt.c
  */

  #include <stdio.h>
- #include <ctype.h>
  //extern int strcpy(char*, char*);
  //extern char * strtok(char*, char*);

--- 10,19 ----
	destructors found are called by exit().
	return 0 if no constructor or destructor is found otherwise.
	The output is redirected by CC into _ctdt.c
+
  */

  #include <stdio.h>
  //extern int strcpy(char*, char*);
  //extern char * strtok(char*, char*);

***************
*** 55,94 ****
			goto done;
		case '\n':
		{	*p = 0;		// terminate string
!
!			/* Find start of symbol */
!			for (p = buf; isspace(*p); p++)
!			    ;
!
!			/* Verify this is a legal constructor/destructor name */
!			if (strncmp(p, "_ST", 3))
!			    goto newline;
!
!			/* Find end of symbol */
!			for (char *end = p; isalpha(*end) || *end == '_'; end++)
!			    ;
!
!			/* Verify this is the entry point, not the text address */
!			if (strncmp(end-2, "_E", 2))
!			    goto newline;
!
!			/* Remove _E which will be appended back by cc */
!			*(end-2) = '\0';
!
!			/* printf("Adding name '%s'\n", p); */
!
!			switch (p[3]) {
			case 'D':
!				dtor = new sbuf(dtor,p);
!				break;
			case 'I':
!				ctor = new sbuf(ctor,p);
!				break;
			default:
-				break;
-			}
			goto newline;
		}
		default:
			*p++ = c;
		}
--- 50,70 ----
			goto done;
		case '\n':
		{	*p = 0;		// terminate string
!			p = buf;
!			while (*p++!='_') if (*p == 0) goto newline;
!			for (p--; *p == '_'; p++) ;	// accept _STI and __STI
!			register char* st = p-1;
!			if (st[0]!='_' || st[1]!='S' || st[2]!='T') goto newline;
!			switch (st[3]) {
			case 'D':
!				dtor = new sbuf(dtor,st);
!				goto newline;
			case 'I':
!				ctor = new sbuf(ctor,st);
			default:
				goto newline;
			}
+		}
		default:
			*p++ = c;
		}
--
    Jon Leech (leech@cs.unc.edu)    __@/
    "Totally bounded: A set that can be patrolled by a finite number
     of arbitrarily near-sighted policemen."    A. Wilonsky, 1978